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  }