github.com/arieschain/arieschain@v0.0.0-20191023063405-37c074544356/p2p/netutil/error_test.go (about) 1 package netutil 2 3 import ( 4 "net" 5 "testing" 6 "time" 7 ) 8 9 // This test checks that isPacketTooBig correctly identifies 10 // errors that result from receiving a UDP packet larger 11 // than the supplied receive buffer. 12 func TestIsPacketTooBig(t *testing.T) { 13 listener, err := net.ListenPacket("udp", "127.0.0.1:0") 14 if err != nil { 15 t.Fatal(err) 16 } 17 defer listener.Close() 18 sender, err := net.Dial("udp", listener.LocalAddr().String()) 19 if err != nil { 20 t.Fatal(err) 21 } 22 defer sender.Close() 23 24 sendN := 1800 25 recvN := 300 26 for i := 0; i < 20; i++ { 27 go func() { 28 buf := make([]byte, sendN) 29 for i := range buf { 30 buf[i] = byte(i) 31 } 32 sender.Write(buf) 33 }() 34 35 buf := make([]byte, recvN) 36 listener.SetDeadline(time.Now().Add(1 * time.Second)) 37 n, _, err := listener.ReadFrom(buf) 38 if err != nil { 39 if nerr, ok := err.(net.Error); ok && nerr.Timeout() { 40 continue 41 } 42 if !isPacketTooBig(err) { 43 t.Fatalf("unexpected read error: %v", err) 44 } 45 continue 46 } 47 if n != recvN { 48 t.Fatalf("short read: %d, want %d", n, recvN) 49 } 50 for i := range buf { 51 if buf[i] != byte(i) { 52 t.Fatalf("error in pattern") 53 break 54 } 55 } 56 } 57 }