From: Matt Joiner Date: Thu, 4 Dec 2014 01:57:43 +0000 (-0600) Subject: A probably unhelpful test that ensures UTP performs X-Git-Tag: v1.0.0~1421 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=7ba25ce936146c91bcc8d6f90dde25713e229019;p=btrtrc.git A probably unhelpful test that ensures UTP performs --- diff --git a/client_test.go b/client_test.go index 4db505df..d5ba379d 100644 --- a/client_test.go +++ b/client_test.go @@ -1,10 +1,15 @@ package torrent import ( + "fmt" + "log" + "net" "os" "testing" "time" + "github.com/h2so5/utp" + "bitbucket.org/anacrolix/go.torrent/testutil" "bitbucket.org/anacrolix/go.torrent/util" "github.com/anacrolix/libtorgo/bencode" @@ -103,3 +108,66 @@ func TestReducedDialTimeout(t *testing.T) { } } } + +func TestUTPRawConn(t *testing.T) { + l, err := utp.Listen("utp", &utp.Addr{&net.UDPAddr{Port: 0}}) + if err != nil { + t.Fatal(err) + } + defer l.Close() + go func() { + for { + _, err := l.Accept() + if err != nil { + break + } + } + }() + // Connect a UTP peer to see if the RawConn will still work. + utpPeer, err := utp.DialUTP("utp", nil, l.Addr().(*utp.Addr)) + if err != nil { + t.Fatalf("error dialing utp listener: %s", err) + } + defer utpPeer.Close() + peer, err := net.ListenPacket("udp", ":0") + if err != nil { + t.Fatal(err) + } + defer peer.Close() + + msgsReceived := 0 + const N = 5000 // How many messages to send. + readerStopped := make(chan struct{}) + // The reader goroutine. + go func() { + defer close(readerStopped) + b := make([]byte, 500) + for i := 0; i < N; i++ { + n, _, err := l.RawConn.ReadFrom(b) + if err != nil { + t.Fatalf("error reading from raw conn: %s", err) + } + msgsReceived++ + var d int + fmt.Sscan(string(b[:n]), &d) + if d != i { + log.Printf("got wrong number: expected %d, got %d", i, d) + } + } + }() + for i := 0; i < N; i++ { + _, err := peer.WriteTo([]byte(fmt.Sprintf("%d", i)), l.Addr().(*utp.Addr).Addr) + if err != nil { + t.Fatal(err) + } + time.Sleep(time.Microsecond) + } + select { + case <-readerStopped: + case <-time.After(time.Second): + t.Fatal("reader timed out") + } + if msgsReceived != N { + t.Fatalf("messages received: %d", msgsReceived) + } +}