diff options
author | Jeffrey Wilcke <jeffrey@ethereum.org> | 2015-05-14 19:06:13 +0800 |
---|---|---|
committer | Jeffrey Wilcke <jeffrey@ethereum.org> | 2015-05-14 19:06:13 +0800 |
commit | 7fa740996cf01b56a734e579fcfcd9c2e8585ac5 (patch) | |
tree | 23a9fcf8248a12570e67155c21263f50df014f39 /p2p/nat/nat_test.go | |
parent | c7a13c9be86417848582a2ab6704586f92dff27c (diff) | |
parent | 5f706cd7f5a97b3354b23de4273009f08586ff04 (diff) | |
download | go-tangerine-7fa740996cf01b56a734e579fcfcd9c2e8585ac5.tar go-tangerine-7fa740996cf01b56a734e579fcfcd9c2e8585ac5.tar.gz go-tangerine-7fa740996cf01b56a734e579fcfcd9c2e8585ac5.tar.bz2 go-tangerine-7fa740996cf01b56a734e579fcfcd9c2e8585ac5.tar.lz go-tangerine-7fa740996cf01b56a734e579fcfcd9c2e8585ac5.tar.xz go-tangerine-7fa740996cf01b56a734e579fcfcd9c2e8585ac5.tar.zst go-tangerine-7fa740996cf01b56a734e579fcfcd9c2e8585ac5.zip |
Merge pull request #960 from fjl/nat-fixes
p2p/nat: fix UPnP auto discovery
Diffstat (limited to 'p2p/nat/nat_test.go')
-rw-r--r-- | p2p/nat/nat_test.go | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/p2p/nat/nat_test.go b/p2p/nat/nat_test.go new file mode 100644 index 000000000..95c50522e --- /dev/null +++ b/p2p/nat/nat_test.go @@ -0,0 +1,48 @@ +package nat + +import ( + "bytes" + "net" + "testing" + "time" +) + +// This test checks that autodisc doesn't hang and returns +// consistent results when multiple goroutines call its methods +// concurrently. +func TestAutoDiscRace(t *testing.T) { + ad := startautodisc("thing", func() Interface { + time.Sleep(500 * time.Millisecond) + return extIP{33, 44, 55, 66} + }) + + // Spawn a few concurrent calls to ad.ExternalIP. + type rval struct { + ip net.IP + err error + } + results := make(chan rval, 50) + for i := 0; i < cap(results); i++ { + go func() { + ip, err := ad.ExternalIP() + results <- rval{ip, err} + }() + } + + // Check that they all return the correct result within the deadline. + deadline := time.After(550 * time.Millisecond) + for i := 0; i < cap(results); i++ { + select { + case <-deadline: + t.Fatal("deadline exceeded") + case rval := <-results: + if rval.err != nil { + t.Errorf("result %d: unexpected error: %v", i, rval.err) + } + wantIP := net.IP{33, 44, 55, 66} + if !bytes.Equal(rval.ip, wantIP) { + t.Errorf("result %d: got IP %v, want %v", i, rval.ip, wantIP) + } + } + } +} |