github.com/inphi/go-ethereum@v1.9.7/p2p/simulations/adapters/inproc_test.go (about) 1 // Copyright 2018 The go-ethereum Authors 2 // This file is part of the go-ethereum library. 3 // 4 // The go-ethereum library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The go-ethereum library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 16 17 package adapters 18 19 import ( 20 "bytes" 21 "encoding/binary" 22 "fmt" 23 "testing" 24 "time" 25 26 "github.com/ethereum/go-ethereum/p2p/simulations/pipes" 27 ) 28 29 func TestTCPPipe(t *testing.T) { 30 c1, c2, err := pipes.TCPPipe() 31 if err != nil { 32 t.Fatal(err) 33 } 34 35 done := make(chan struct{}) 36 37 go func() { 38 msgs := 50 39 size := 1024 40 for i := 0; i < msgs; i++ { 41 msg := make([]byte, size) 42 _ = binary.PutUvarint(msg, uint64(i)) 43 44 _, err := c1.Write(msg) 45 if err != nil { 46 t.Fatal(err) 47 } 48 } 49 50 for i := 0; i < msgs; i++ { 51 msg := make([]byte, size) 52 _ = binary.PutUvarint(msg, uint64(i)) 53 54 out := make([]byte, size) 55 _, err := c2.Read(out) 56 if err != nil { 57 t.Fatal(err) 58 } 59 60 if !bytes.Equal(msg, out) { 61 t.Fatalf("expected %#v, got %#v", msg, out) 62 } 63 } 64 done <- struct{}{} 65 }() 66 67 select { 68 case <-done: 69 case <-time.After(5 * time.Second): 70 t.Fatal("test timeout") 71 } 72 } 73 74 func TestTCPPipeBidirections(t *testing.T) { 75 c1, c2, err := pipes.TCPPipe() 76 if err != nil { 77 t.Fatal(err) 78 } 79 80 done := make(chan struct{}) 81 82 go func() { 83 msgs := 50 84 size := 7 85 for i := 0; i < msgs; i++ { 86 msg := []byte(fmt.Sprintf("ping %02d", i)) 87 88 _, err := c1.Write(msg) 89 if err != nil { 90 t.Fatal(err) 91 } 92 } 93 94 for i := 0; i < msgs; i++ { 95 expected := []byte(fmt.Sprintf("ping %02d", i)) 96 97 out := make([]byte, size) 98 _, err := c2.Read(out) 99 if err != nil { 100 t.Fatal(err) 101 } 102 103 if !bytes.Equal(expected, out) { 104 t.Fatalf("expected %#v, got %#v", out, expected) 105 } else { 106 msg := []byte(fmt.Sprintf("pong %02d", i)) 107 _, err := c2.Write(msg) 108 if err != nil { 109 t.Fatal(err) 110 } 111 } 112 } 113 114 for i := 0; i < msgs; i++ { 115 expected := []byte(fmt.Sprintf("pong %02d", i)) 116 117 out := make([]byte, size) 118 _, err := c1.Read(out) 119 if err != nil { 120 t.Fatal(err) 121 } 122 123 if !bytes.Equal(expected, out) { 124 t.Fatalf("expected %#v, got %#v", out, expected) 125 } 126 } 127 done <- struct{}{} 128 }() 129 130 select { 131 case <-done: 132 case <-time.After(5 * time.Second): 133 t.Fatal("test timeout") 134 } 135 } 136 137 func TestNetPipe(t *testing.T) { 138 c1, c2, err := pipes.NetPipe() 139 if err != nil { 140 t.Fatal(err) 141 } 142 143 done := make(chan struct{}) 144 145 go func() { 146 msgs := 50 147 size := 1024 148 // netPipe is blocking, so writes are emitted asynchronously 149 go func() { 150 for i := 0; i < msgs; i++ { 151 msg := make([]byte, size) 152 _ = binary.PutUvarint(msg, uint64(i)) 153 154 _, err := c1.Write(msg) 155 if err != nil { 156 t.Fatal(err) 157 } 158 } 159 }() 160 161 for i := 0; i < msgs; i++ { 162 msg := make([]byte, size) 163 _ = binary.PutUvarint(msg, uint64(i)) 164 165 out := make([]byte, size) 166 _, err := c2.Read(out) 167 if err != nil { 168 t.Fatal(err) 169 } 170 171 if !bytes.Equal(msg, out) { 172 t.Fatalf("expected %#v, got %#v", msg, out) 173 } 174 } 175 176 done <- struct{}{} 177 }() 178 179 select { 180 case <-done: 181 case <-time.After(5 * time.Second): 182 t.Fatal("test timeout") 183 } 184 } 185 186 func TestNetPipeBidirections(t *testing.T) { 187 c1, c2, err := pipes.NetPipe() 188 if err != nil { 189 t.Fatal(err) 190 } 191 192 done := make(chan struct{}) 193 194 go func() { 195 msgs := 1000 196 size := 8 197 pingTemplate := "ping %03d" 198 pongTemplate := "pong %03d" 199 200 // netPipe is blocking, so writes are emitted asynchronously 201 go func() { 202 for i := 0; i < msgs; i++ { 203 msg := []byte(fmt.Sprintf(pingTemplate, i)) 204 205 _, err := c1.Write(msg) 206 if err != nil { 207 t.Fatal(err) 208 } 209 } 210 }() 211 212 // netPipe is blocking, so reads for pong are emitted asynchronously 213 go func() { 214 for i := 0; i < msgs; i++ { 215 expected := []byte(fmt.Sprintf(pongTemplate, i)) 216 217 out := make([]byte, size) 218 _, err := c1.Read(out) 219 if err != nil { 220 t.Fatal(err) 221 } 222 223 if !bytes.Equal(expected, out) { 224 t.Fatalf("expected %#v, got %#v", expected, out) 225 } 226 } 227 228 done <- struct{}{} 229 }() 230 231 // expect to read pings, and respond with pongs to the alternate connection 232 for i := 0; i < msgs; i++ { 233 expected := []byte(fmt.Sprintf(pingTemplate, i)) 234 235 out := make([]byte, size) 236 _, err := c2.Read(out) 237 if err != nil { 238 t.Fatal(err) 239 } 240 241 if !bytes.Equal(expected, out) { 242 t.Fatalf("expected %#v, got %#v", expected, out) 243 } else { 244 msg := []byte(fmt.Sprintf(pongTemplate, i)) 245 246 _, err := c2.Write(msg) 247 if err != nil { 248 t.Fatal(err) 249 } 250 } 251 } 252 }() 253 254 select { 255 case <-done: 256 case <-time.After(5 * time.Second): 257 t.Fatal("test timeout") 258 } 259 }