github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/p2p/simulations/adapters/inproc_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 //</624342660789833728> 11 12 13 package adapters 14 15 import ( 16 "bytes" 17 "encoding/binary" 18 "fmt" 19 "testing" 20 "time" 21 22 "github.com/ethereum/go-ethereum/p2p/simulations/pipes" 23 ) 24 25 func TestTCPPipe(t *testing.T) { 26 c1, c2, err := pipes.TCPPipe() 27 if err != nil { 28 t.Fatal(err) 29 } 30 31 done := make(chan struct{}) 32 33 go func() { 34 msgs := 50 35 size := 1024 36 for i := 0; i < msgs; i++ { 37 msg := make([]byte, size) 38 _ = binary.PutUvarint(msg, uint64(i)) 39 40 _, err := c1.Write(msg) 41 if err != nil { 42 t.Fatal(err) 43 } 44 } 45 46 for i := 0; i < msgs; i++ { 47 msg := make([]byte, size) 48 _ = binary.PutUvarint(msg, uint64(i)) 49 50 out := make([]byte, size) 51 _, err := c2.Read(out) 52 if err != nil { 53 t.Fatal(err) 54 } 55 56 if !bytes.Equal(msg, out) { 57 t.Fatalf("expected %#v, got %#v", msg, out) 58 } 59 } 60 done <- struct{}{} 61 }() 62 63 select { 64 case <-done: 65 case <-time.After(5 * time.Second): 66 t.Fatal("test timeout") 67 } 68 } 69 70 func TestTCPPipeBidirections(t *testing.T) { 71 c1, c2, err := pipes.TCPPipe() 72 if err != nil { 73 t.Fatal(err) 74 } 75 76 done := make(chan struct{}) 77 78 go func() { 79 msgs := 50 80 size := 7 81 for i := 0; i < msgs; i++ { 82 msg := []byte(fmt.Sprintf("ping %02d", i)) 83 84 _, err := c1.Write(msg) 85 if err != nil { 86 t.Fatal(err) 87 } 88 } 89 90 for i := 0; i < msgs; i++ { 91 expected := []byte(fmt.Sprintf("ping %02d", i)) 92 93 out := make([]byte, size) 94 _, err := c2.Read(out) 95 if err != nil { 96 t.Fatal(err) 97 } 98 99 if !bytes.Equal(expected, out) { 100 t.Fatalf("expected %#v, got %#v", out, expected) 101 } else { 102 msg := []byte(fmt.Sprintf("pong %02d", i)) 103 _, err := c2.Write(msg) 104 if err != nil { 105 t.Fatal(err) 106 } 107 } 108 } 109 110 for i := 0; i < msgs; i++ { 111 expected := []byte(fmt.Sprintf("pong %02d", i)) 112 113 out := make([]byte, size) 114 _, err := c1.Read(out) 115 if err != nil { 116 t.Fatal(err) 117 } 118 119 if !bytes.Equal(expected, out) { 120 t.Fatalf("expected %#v, got %#v", out, expected) 121 } 122 } 123 done <- struct{}{} 124 }() 125 126 select { 127 case <-done: 128 case <-time.After(5 * time.Second): 129 t.Fatal("test timeout") 130 } 131 } 132 133 func TestNetPipe(t *testing.T) { 134 c1, c2, err := pipes.NetPipe() 135 if err != nil { 136 t.Fatal(err) 137 } 138 139 done := make(chan struct{}) 140 141 go func() { 142 msgs := 50 143 size := 1024 144 //网管阻塞,因此写操作是异步发出的。 145 go func() { 146 for i := 0; i < msgs; i++ { 147 msg := make([]byte, size) 148 _ = binary.PutUvarint(msg, uint64(i)) 149 150 _, err := c1.Write(msg) 151 if err != nil { 152 t.Fatal(err) 153 } 154 } 155 }() 156 157 for i := 0; i < msgs; i++ { 158 msg := make([]byte, size) 159 _ = binary.PutUvarint(msg, uint64(i)) 160 161 out := make([]byte, size) 162 _, err := c2.Read(out) 163 if err != nil { 164 t.Fatal(err) 165 } 166 167 if !bytes.Equal(msg, out) { 168 t.Fatalf("expected %#v, got %#v", msg, out) 169 } 170 } 171 172 done <- struct{}{} 173 }() 174 175 select { 176 case <-done: 177 case <-time.After(5 * time.Second): 178 t.Fatal("test timeout") 179 } 180 } 181 182 func TestNetPipeBidirections(t *testing.T) { 183 c1, c2, err := pipes.NetPipe() 184 if err != nil { 185 t.Fatal(err) 186 } 187 188 done := make(chan struct{}) 189 190 go func() { 191 msgs := 1000 192 size := 8 193 pingTemplate := "ping %03d" 194 pongTemplate := "pong %03d" 195 196 //网管阻塞,因此写操作是异步发出的。 197 go func() { 198 for i := 0; i < msgs; i++ { 199 msg := []byte(fmt.Sprintf(pingTemplate, i)) 200 201 _, err := c1.Write(msg) 202 if err != nil { 203 t.Fatal(err) 204 } 205 } 206 }() 207 208 //网管阻塞,因此对pong的读取是异步发出的。 209 go func() { 210 for i := 0; i < msgs; i++ { 211 expected := []byte(fmt.Sprintf(pongTemplate, i)) 212 213 out := make([]byte, size) 214 _, err := c1.Read(out) 215 if err != nil { 216 t.Fatal(err) 217 } 218 219 if !bytes.Equal(expected, out) { 220 t.Fatalf("expected %#v, got %#v", expected, out) 221 } 222 } 223 224 done <- struct{}{} 225 }() 226 227 //期望读取ping,并用pong响应备用连接 228 for i := 0; i < msgs; i++ { 229 expected := []byte(fmt.Sprintf(pingTemplate, i)) 230 231 out := make([]byte, size) 232 _, err := c2.Read(out) 233 if err != nil { 234 t.Fatal(err) 235 } 236 237 if !bytes.Equal(expected, out) { 238 t.Fatalf("expected %#v, got %#v", expected, out) 239 } else { 240 msg := []byte(fmt.Sprintf(pongTemplate, i)) 241 242 _, err := c2.Write(msg) 243 if err != nil { 244 t.Fatal(err) 245 } 246 } 247 } 248 }() 249 250 select { 251 case <-done: 252 case <-time.After(5 * time.Second): 253 t.Fatal("test timeout") 254 } 255 } 256