github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/p2p/netutil/error_test.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 19:16:41</date>
    10  //</624450105264574464>
    11  
    12  
    13  package netutil
    14  
    15  import (
    16  	"net"
    17  	"testing"
    18  	"time"
    19  )
    20  
    21  //此测试检查ispackettoobig是否正确识别
    22  //接收更大的UDP数据包导致的错误
    23  //比提供的接收缓冲区大。
    24  func TestIsPacketTooBig(t *testing.T) {
    25  	listener, err := net.ListenPacket("udp", "127.0.0.1:0")
    26  	if err != nil {
    27  		t.Fatal(err)
    28  	}
    29  	defer listener.Close()
    30  	sender, err := net.Dial("udp", listener.LocalAddr().String())
    31  	if err != nil {
    32  		t.Fatal(err)
    33  	}
    34  	defer sender.Close()
    35  
    36  	sendN := 1800
    37  	recvN := 300
    38  	for i := 0; i < 20; i++ {
    39  		go func() {
    40  			buf := make([]byte, sendN)
    41  			for i := range buf {
    42  				buf[i] = byte(i)
    43  			}
    44  			sender.Write(buf)
    45  		}()
    46  
    47  		buf := make([]byte, recvN)
    48  		listener.SetDeadline(time.Now().Add(1 * time.Second))
    49  		n, _, err := listener.ReadFrom(buf)
    50  		if err != nil {
    51  			if nerr, ok := err.(net.Error); ok && nerr.Timeout() {
    52  				continue
    53  			}
    54  			if !isPacketTooBig(err) {
    55  				t.Fatalf("unexpected read error: %v", err)
    56  			}
    57  			continue
    58  		}
    59  		if n != recvN {
    60  			t.Fatalf("short read: %d, want %d", n, recvN)
    61  		}
    62  		for i := range buf {
    63  			if buf[i] != byte(i) {
    64  				t.Fatalf("error in pattern")
    65  				break
    66  			}
    67  		}
    68  	}
    69  }
    70