| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package main |
| |
| import ( |
| "net" |
| "regexp" |
| "strconv" |
| "testing" |
| "time" |
| |
| bootservertest "go.fuchsia.dev/fuchsia/tools/bootserver_old/tests" |
| ) |
| |
| func TestAdvertFrequency(t *testing.T) { |
| _ = bootservertest.StartQemu(t, []string{"netsvc.all-features=true", "netsvc.netboot=true"}, "full") |
| |
| // Get the node ipv6 address |
| out := bootservertest.CmdWithOutput(t, bootservertest.ToolPath(t, "netls")) |
| // Extract the ipv6 from the netls output |
| regexString := bootservertest.DefaultNodename + ` \((.*)/(.*)\)` |
| match := regexp.MustCompile(regexString).FindSubmatch(out) |
| if len(match) != 3 { |
| t.Fatalf("node %s not found in netls output - %s", bootservertest.DefaultNodename, out) |
| } |
| index, err := strconv.Atoi(string(match[2])) |
| if err != nil { |
| t.Fatal(err) |
| } |
| ifi, err := net.InterfaceByIndex(index) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| conn, err := net.ListenMulticastUDP("udp6", ifi, &net.UDPAddr{ |
| IP: net.IPv6linklocalallnodes, |
| Port: 33331, |
| }) |
| if err != nil { |
| t.Fatal(err) |
| } |
| defer conn.Close() |
| ip := net.ParseIP(string(match[1])) |
| if ip == nil { |
| t.Fatalf("can't parse %s as IP", match[1]) |
| } |
| |
| for i := 0; i < 50; i++ { |
| if _, err := conn.WriteToUDP(nil, &net.UDPAddr{ |
| IP: ip, |
| Port: 1337, |
| Zone: strconv.Itoa(index), |
| }); err != nil { |
| t.Fatal(err) |
| } |
| } |
| |
| var dst [1]byte |
| |
| // The system may be slow to start; do the first read without deadlines. |
| if _, _, err := conn.ReadFromUDP(dst[:]); err != nil { |
| t.Fatal(err) |
| } |
| |
| if err := conn.SetDeadline(time.Now().Add(800 * time.Millisecond)); err != nil { |
| t.Fatal(err) |
| } |
| if n, addr, err := conn.ReadFromUDP(dst[:]); err == nil { |
| t.Errorf("expected one advertisement packet, got %d bytes from %s", n, addr) |
| } else if tErr, ok := err.(net.Error); !ok || !tErr.Timeout() { |
| t.Errorf("expected timeout error, got %s", err) |
| } |
| } |