mirror of
https://gitlab.com/NebulousLabs/go-upnp.git
synced 2025-09-27 11:22:30 +08:00
98 lines
1.8 KiB
Go
98 lines
1.8 KiB
Go
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)
|
|
}
|
|
}
|