package upnp import ( "context" "sync" "testing" "time" ) // TestConcurrentUPNP tests that several threads calling Discover() concurrently // succeed. func TestConcurrentUPNP(t *testing.T) { if testing.Short() { t.SkipNow() } // verify that a router exists ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() _, err := DiscoverCtx(ctx) if err != nil { t.Skip(err) } // now try to concurrently Discover() using 20 threads var wg sync.WaitGroup for i := 0; i < 20; i++ { wg.Add(1) go func() { defer wg.Done() ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() _, err := DiscoverCtx(ctx) if err != nil { t.Error(err) } }() } wg.Wait() } func TestIGD(t *testing.T) { // connect to router ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() d, err := DiscoverCtx(ctx) if err != nil { t.Skip(err) } // discover external IP ip, err := d.ExternalIP() if err != nil { t.Fatal(err) } t.Log("Your external IP is:", ip) // forward a port err = d.Forward(9001, "upnp test") if err != nil { t.Fatal(err) } // check that port 9001 is now forwarded forwarded, err := d.IsForwardedTCP(9001) if err != nil { t.Fatal(err) } else if !forwarded { t.Fatal("port 9001 was not reported as forwarded") } // un-forward a port err = d.Clear(9001) if err != nil { t.Fatal(err) } // check that port 9001 is no longer forwarded forwarded, err = d.IsForwardedTCP(9001) if err != nil { t.Fatal(err) } else if forwarded { t.Fatal("port 9001 should no longer be forwarded") } // record router's location loc := d.Location() if err != nil { t.Fatal(err) } t.Log("Loc:", loc) // connect to router directly d, err = Load(loc) if err != nil { t.Fatal(err) } }