github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/p2p/message_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 12:09:44</date> 10 //</624342658554269696> 11 12 13 package p2p 14 15 import ( 16 "bytes" 17 "encoding/hex" 18 "fmt" 19 "io" 20 "runtime" 21 "strings" 22 "testing" 23 "time" 24 ) 25 26 func ExampleMsgPipe() { 27 rw1, rw2 := MsgPipe() 28 go func() { 29 Send(rw1, 8, [][]byte{{0, 0}}) 30 Send(rw1, 5, [][]byte{{1, 1}}) 31 rw1.Close() 32 }() 33 34 for { 35 msg, err := rw2.ReadMsg() 36 if err != nil { 37 break 38 } 39 var data [][]byte 40 msg.Decode(&data) 41 fmt.Printf("msg: %d, %x\n", msg.Code, data[0]) 42 } 43 //输出: 44 //味精:8, 0000 45 //味精:5, 0101 46 } 47 48 func TestMsgPipeUnblockWrite(t *testing.T) { 49 loop: 50 for i := 0; i < 100; i++ { 51 rw1, rw2 := MsgPipe() 52 done := make(chan struct{}) 53 go func() { 54 if err := SendItems(rw1, 1); err == nil { 55 t.Error("EncodeMsg returned nil error") 56 } else if err != ErrPipeClosed { 57 t.Errorf("EncodeMsg returned wrong error: got %v, want %v", err, ErrPipeClosed) 58 } 59 close(done) 60 }() 61 62 //此调用应确保EncodeMsg正在等待 63 //有时交付。如果不这样做,关闭很可能 64 //在encodemsg启动之前执行,然后我们将不测试 65 //所有病例。 66 runtime.Gosched() 67 68 rw2.Close() 69 select { 70 case <-done: 71 case <-time.After(200 * time.Millisecond): 72 t.Errorf("write didn't unblock") 73 break loop 74 } 75 } 76 } 77 78 //如果未正确执行并发关闭操作,则此测试应该会死机。 79 func TestMsgPipeConcurrentClose(t *testing.T) { 80 rw1, _ := MsgPipe() 81 for i := 0; i < 10; i++ { 82 go rw1.Close() 83 } 84 } 85 86 func TestEOFSignal(t *testing.T) { 87 rb := make([]byte, 10) 88 89 //空读者 90 eof := make(chan struct{}, 1) 91 sig := &eofSignal{new(bytes.Buffer), 0, eof} 92 if n, err := sig.Read(rb); n != 0 || err != io.EOF { 93 t.Errorf("Read returned unexpected values: (%v, %v)", n, err) 94 } 95 select { 96 case <-eof: 97 default: 98 t.Error("EOF chan not signaled") 99 } 100 101 //错误前计数 102 eof = make(chan struct{}, 1) 103 sig = &eofSignal{bytes.NewBufferString("aaaaaaaa"), 4, eof} 104 if n, err := sig.Read(rb); n != 4 || err != nil { 105 t.Errorf("Read returned unexpected values: (%v, %v)", n, err) 106 } 107 select { 108 case <-eof: 109 default: 110 t.Error("EOF chan not signaled") 111 } 112 113 //计数前出错 114 eof = make(chan struct{}, 1) 115 sig = &eofSignal{bytes.NewBufferString("aaaa"), 999, eof} 116 if n, err := sig.Read(rb); n != 4 || err != nil { 117 t.Errorf("Read returned unexpected values: (%v, %v)", n, err) 118 } 119 if n, err := sig.Read(rb); n != 0 || err != io.EOF { 120 t.Errorf("Read returned unexpected values: (%v, %v)", n, err) 121 } 122 select { 123 case <-eof: 124 default: 125 t.Error("EOF chan not signaled") 126 } 127 128 //如果两者都不发生,则无信号 129 eof = make(chan struct{}, 1) 130 sig = &eofSignal{bytes.NewBufferString("aaaaaaaaaaaaaaaaaaaaa"), 999, eof} 131 if n, err := sig.Read(rb); n != 10 || err != nil { 132 t.Errorf("Read returned unexpected values: (%v, %v)", n, err) 133 } 134 select { 135 case <-eof: 136 t.Error("unexpected EOF signal") 137 default: 138 } 139 } 140 141 func unhex(str string) []byte { 142 r := strings.NewReplacer("\t", "", " ", "", "\n", "") 143 b, err := hex.DecodeString(r.Replace(str)) 144 if err != nil { 145 panic(fmt.Sprintf("invalid hex string: %q", str)) 146 } 147 return b 148 } 149