/* Basically the same as route_creation_3_to_0: send teststring from 3 to 0 and
 * see if a route is established, but this time without any intermediate checks
 * (since they seem to avoid breaking behavior that has been seen in the wild)
 */
func main() {
	test_name := "route_creation_3_to_0_short"
	riot_line := mgmt.Create_clean_setup(test_name)

	fmt.Println("Starting test ", test_name)

	/* note: the seqnums are *sometimes* != 1 because apparently
	 * weird RREQs are sent out before the experiment, screwing up the node's seqnum
	 * and I haven't figured out why yet. So until that mystery is solved
	 * they are set to aodvv2_test_management.WILDCARD */
	orig_seqnum := "\"" + mgmt.WILDCARD + "\""
	targ_seqnum := "\"" + mgmt.WILDCARD + "\""
	beginning := riot_line[3]
	end := riot_line[0]

	beginning.Channels.Send(fmt.Sprintf("send %s %s\n", end.Ip, mgmt.Test_string))

	/* Now a route should be discovered.....*/

	/* check node 3 (aka the beginning) */
	beginning.Channels.Expect_JSON(mgmt.Make_JSON_str(mgmt.Tmpl_received_rrep, map[string]string{
		"Last_hop":    riot_line[2].Ip,
		"Orig_addr":   beginning.Ip,
		"Orig_seqnum": orig_seqnum,
		"Targ_addr":   end.Ip,
		"Targ_seqnum": targ_seqnum,
	}))

	fmt.Println("\nDone.")

}
func main() {
	test_name := "route_creation_0_to_3"

	riot_line := mgmt.Create_clean_setup(test_name)

	fmt.Println("Starting test ", test_name)

	beginning := riot_line[0]
	end := riot_line[len(riot_line)-1]

	beginning.Channels.Send(fmt.Sprintf("send %s %s\n", end.Ip, mgmt.Test_string))

	/* Discover route at node 0...  */
	beginning.Channels.Expect_JSON(mgmt.Make_JSON_str(mgmt.Tmpl_sent_rreq, map[string]string{
		"Orig_addr":   beginning.Ip,
		"Targ_addr":   end.Ip,
		"Orig_seqnum": "1",
		"Metric":      "0",
	}))

	/* check node 1 */
	riot_line[1].Channels.Expect_JSON(mgmt.Make_JSON_str(mgmt.Tmpl_received_rreq, map[string]string{
		"Last_hop":    beginning.Ip,
		"Orig_addr":   beginning.Ip,
		"Targ_addr":   end.Ip,
		"Orig_seqnum": "1",
		"Metric":      "0",
	}))
	riot_line[1].Channels.Expect_JSON(mgmt.Make_JSON_str(mgmt.Tmpl_added_rt_entry, map[string]string{
		"Addr":     beginning.Ip,
		"Next_hop": beginning.Ip,
		"Seqnum":   "1",
		"Metric":   "1",
		"State":    strconv.Itoa(mgmt.ROUTE_STATE_ACTIVE),
	}))
	riot_line[1].Channels.Expect_JSON(mgmt.Make_JSON_str(mgmt.Tmpl_sent_rreq, map[string]string{
		"Orig_addr":   beginning.Ip,
		"Targ_addr":   end.Ip,
		"Orig_seqnum": "1",
		"Metric":      "1",
	}))

	/* check node 2 */
	riot_line[2].Channels.Expect_JSON(mgmt.Make_JSON_str(mgmt.Tmpl_received_rreq, map[string]string{
		"Last_hop":    riot_line[1].Ip,
		"Orig_addr":   beginning.Ip,
		"Targ_addr":   end.Ip,
		"Orig_seqnum": "1",
		"Metric":      "1",
	}))
	riot_line[2].Channels.Expect_JSON(mgmt.Make_JSON_str(mgmt.Tmpl_added_rt_entry, map[string]string{
		"Addr":     beginning.Ip,
		"Next_hop": riot_line[1].Ip,
		"Seqnum":   "1",
		"Metric":   "2",
		"State":    strconv.Itoa(mgmt.ROUTE_STATE_ACTIVE),
	}))
	riot_line[2].Channels.Expect_JSON(mgmt.Make_JSON_str(mgmt.Tmpl_sent_rreq, map[string]string{
		"Orig_addr":   beginning.Ip,
		"Targ_addr":   end.Ip,
		"Orig_seqnum": "1",
		"Metric":      "2",
	}))

	/* check node 3 (aka the end) */
	end.Channels.Expect_JSON(mgmt.Make_JSON_str(mgmt.Tmpl_received_rreq, map[string]string{
		"Last_hop":    riot_line[2].Ip,
		"Orig_addr":   beginning.Ip,
		"Targ_addr":   end.Ip,
		"Orig_seqnum": "1",
		"Metric":      "2",
	}))
	end.Channels.Expect_JSON(mgmt.Make_JSON_str(mgmt.Tmpl_added_rt_entry, map[string]string{
		"Addr":     beginning.Ip,
		"Next_hop": riot_line[2].Ip,
		"Seqnum":   "1",
		"Metric":   "3",
		"State":    strconv.Itoa(mgmt.ROUTE_STATE_ACTIVE),
	}))
	/* And send a RREP back */
	end.Channels.Expect_JSON(mgmt.Make_JSON_str(mgmt.Tmpl_sent_rrep, map[string]string{
		"Next_hop":    riot_line[2].Ip,
		"Orig_addr":   beginning.Ip,
		"Orig_seqnum": "1",
		"Targ_addr":   end.Ip,
	}))

	/* check node 2 */
	/* Targ_seqnum is *sometimes* 2 because apparently
	 * weird RREQs are sent out before the experiment, screwing up the targaddr seqnum
	 * and I haven't figured out why yet. So until that mystery is solved
	 * Targ_seqnum is set to aodvv2_test_management.WILDCARD */
	targ_seqnum := "\"" + mgmt.WILDCARD + "\""
	riot_line[2].Channels.Expect_JSON(mgmt.Make_JSON_str(mgmt.Tmpl_received_rrep, map[string]string{
		"Last_hop":    end.Ip,
		"Orig_addr":   beginning.Ip,
		"Orig_seqnum": "1",
		"Targ_addr":   end.Ip,
		"Targ_seqnum": targ_seqnum,
	}))
	riot_line[2].Channels.Expect_JSON(mgmt.Make_JSON_str(mgmt.Tmpl_added_rt_entry, map[string]string{
		"Addr":     end.Ip,
		"Next_hop": end.Ip,
		"Seqnum":   targ_seqnum,
		"Metric":   "1",
		"State":    strconv.Itoa(mgmt.ROUTE_STATE_ACTIVE),
	}))
	riot_line[2].Channels.Expect_JSON(mgmt.Make_JSON_str(mgmt.Tmpl_sent_rrep, map[string]string{
		"Next_hop":    riot_line[1].Ip,
		"Orig_addr":   beginning.Ip,
		"Orig_seqnum": "1",
		"Targ_addr":   end.Ip,
	}))

	/* check node 1 */
	riot_line[1].Channels.Expect_JSON(mgmt.Make_JSON_str(mgmt.Tmpl_received_rrep, map[string]string{
		"Last_hop":    riot_line[2].Ip,
		"Orig_addr":   beginning.Ip,
		"Orig_seqnum": "1",
		"Targ_addr":   end.Ip,
		"Targ_seqnum": targ_seqnum,
	}))
	riot_line[1].Channels.Expect_JSON(mgmt.Make_JSON_str(mgmt.Tmpl_added_rt_entry, map[string]string{
		"Addr":     end.Ip,
		"Next_hop": riot_line[2].Ip,
		"Seqnum":   targ_seqnum,
		"Metric":   "2",
		"State":    strconv.Itoa(mgmt.ROUTE_STATE_ACTIVE),
	}))
	riot_line[1].Channels.Expect_JSON(mgmt.Make_JSON_str(mgmt.Tmpl_sent_rrep, map[string]string{
		"Next_hop":    beginning.Ip,
		"Orig_addr":   beginning.Ip,
		"Orig_seqnum": "1",
		"Targ_addr":   end.Ip,
	}))

	/* check node 0 (aka the beginning) */
	beginning.Channels.Expect_JSON(mgmt.Make_JSON_str(mgmt.Tmpl_received_rrep, map[string]string{
		"Last_hop":    riot_line[1].Ip,
		"Orig_addr":   beginning.Ip,
		"Orig_seqnum": "1",
		"Targ_addr":   end.Ip,
		"Targ_seqnum": targ_seqnum,
	}))
	beginning.Channels.Expect_JSON(mgmt.Make_JSON_str(mgmt.Tmpl_added_rt_entry, map[string]string{
		"Addr":     end.Ip,
		"Next_hop": riot_line[1].Ip,
		"Seqnum":   targ_seqnum,
		"Metric":   "3",
		"State":    strconv.Itoa(mgmt.ROUTE_STATE_ACTIVE),
	}))

	fmt.Println("\nDone.\n")
}