github.com/tickoalcantara12/micro/v3@v3.0.0-20221007104245-9d75b9bcbab9/service/network/transport/http/http_transport_test.go (about) 1 // Licensed under the Apache License, Version 2.0 (the "License"); 2 // you may not use this file except in compliance with the License. 3 // You may obtain a copy of the License at 4 // 5 // https://www.apache.org/licenses/LICENSE-2.0 6 // 7 // Unless required by applicable law or agreed to in writing, software 8 // distributed under the License is distributed on an "AS IS" BASIS, 9 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10 // See the License for the specific language governing permissions and 11 // limitations under the License. 12 // 13 // Original source: github.com/micro/go-micro/v3/network/transport/http/http_transport_test.go 14 15 package http 16 17 import ( 18 "io" 19 "net" 20 "sync" 21 "testing" 22 "time" 23 24 "github.com/tickoalcantara12/micro/v3/service/network/transport" 25 ) 26 27 func expectedPort(t *testing.T, expected string, lsn transport.Listener) { 28 _, port, err := net.SplitHostPort(lsn.Addr()) 29 if err != nil { 30 t.Errorf("Expected address to be `%s`, got error: %v", expected, err) 31 } 32 33 if port != expected { 34 lsn.Close() 35 t.Errorf("Expected address to be `%s`, got `%s`", expected, port) 36 } 37 } 38 39 func TestHTTPTransportPortRange(t *testing.T) { 40 tp := NewTransport() 41 42 lsn1, err := tp.Listen(":44444-44448") 43 if err != nil { 44 t.Errorf("Did not expect an error, got %s", err) 45 } 46 expectedPort(t, "44444", lsn1) 47 48 lsn2, err := tp.Listen(":44444-44448") 49 if err != nil { 50 t.Errorf("Did not expect an error, got %s", err) 51 } 52 expectedPort(t, "44445", lsn2) 53 54 lsn, err := tp.Listen("127.0.0.1:0") 55 if err != nil { 56 t.Errorf("Did not expect an error, got %s", err) 57 } 58 59 lsn.Close() 60 lsn1.Close() 61 lsn2.Close() 62 } 63 64 func TestHTTPTransportCommunication(t *testing.T) { 65 tr := NewTransport() 66 67 l, err := tr.Listen("127.0.0.1:0") 68 if err != nil { 69 t.Errorf("Unexpected listen err: %v", err) 70 } 71 defer l.Close() 72 73 fn := func(sock transport.Socket) { 74 defer sock.Close() 75 76 for { 77 var m transport.Message 78 if err := sock.Recv(&m); err != nil { 79 return 80 } 81 82 if err := sock.Send(&m); err != nil { 83 return 84 } 85 } 86 } 87 88 done := make(chan bool) 89 90 go func() { 91 if err := l.Accept(fn); err != nil { 92 select { 93 case <-done: 94 default: 95 t.Errorf("Unexpected accept err: %v", err) 96 } 97 } 98 }() 99 100 c, err := tr.Dial(l.Addr()) 101 if err != nil { 102 t.Errorf("Unexpected dial err: %v", err) 103 } 104 defer c.Close() 105 106 m := transport.Message{ 107 Header: map[string]string{ 108 "Content-Type": "application/json", 109 }, 110 Body: []byte(`{"message": "Hello World"}`), 111 } 112 113 if err := c.Send(&m); err != nil { 114 t.Errorf("Unexpected send err: %v", err) 115 } 116 117 var rm transport.Message 118 119 if err := c.Recv(&rm); err != nil { 120 t.Errorf("Unexpected recv err: %v", err) 121 } 122 123 if string(rm.Body) != string(m.Body) { 124 t.Errorf("Expected %v, got %v", m.Body, rm.Body) 125 } 126 127 close(done) 128 } 129 130 func TestHTTPTransportError(t *testing.T) { 131 tr := NewTransport() 132 133 l, err := tr.Listen("127.0.0.1:0") 134 if err != nil { 135 t.Errorf("Unexpected listen err: %v", err) 136 } 137 defer l.Close() 138 139 fn := func(sock transport.Socket) { 140 defer sock.Close() 141 142 for { 143 var m transport.Message 144 if err := sock.Recv(&m); err != nil { 145 if err == io.EOF { 146 return 147 } 148 t.Fatal(err) 149 } 150 151 sock.(*httpTransportSocket).error(&transport.Message{ 152 Body: []byte(`an error occurred`), 153 }) 154 } 155 } 156 157 done := make(chan bool) 158 159 go func() { 160 if err := l.Accept(fn); err != nil { 161 select { 162 case <-done: 163 default: 164 t.Errorf("Unexpected accept err: %v", err) 165 } 166 } 167 }() 168 169 c, err := tr.Dial(l.Addr()) 170 if err != nil { 171 t.Errorf("Unexpected dial err: %v", err) 172 } 173 defer c.Close() 174 175 m := transport.Message{ 176 Header: map[string]string{ 177 "Content-Type": "application/json", 178 }, 179 Body: []byte(`{"message": "Hello World"}`), 180 } 181 182 if err := c.Send(&m); err != nil { 183 t.Errorf("Unexpected send err: %v", err) 184 } 185 186 var rm transport.Message 187 188 err = c.Recv(&rm) 189 if err == nil { 190 t.Fatal("Expected error but got nil") 191 } 192 193 if err.Error() != "500 Internal Server Error: an error occurred" { 194 t.Fatalf("Did not receive expected error, got: %v", err) 195 } 196 197 close(done) 198 } 199 200 func TestHTTPTransportTimeout(t *testing.T) { 201 tr := NewTransport(transport.Timeout(time.Millisecond * 100)) 202 203 l, err := tr.Listen("127.0.0.1:0") 204 if err != nil { 205 t.Errorf("Unexpected listen err: %v", err) 206 } 207 defer l.Close() 208 209 done := make(chan bool) 210 211 fn := func(sock transport.Socket) { 212 defer func() { 213 sock.Close() 214 close(done) 215 }() 216 217 go func() { 218 select { 219 case <-done: 220 return 221 case <-time.After(time.Second): 222 t.Fatal("deadline not executed") 223 } 224 }() 225 226 for { 227 var m transport.Message 228 229 if err := sock.Recv(&m); err != nil { 230 return 231 } 232 } 233 } 234 235 go func() { 236 if err := l.Accept(fn); err != nil { 237 select { 238 case <-done: 239 default: 240 t.Errorf("Unexpected accept err: %v", err) 241 } 242 } 243 }() 244 245 c, err := tr.Dial(l.Addr()) 246 if err != nil { 247 t.Errorf("Unexpected dial err: %v", err) 248 } 249 defer c.Close() 250 251 m := transport.Message{ 252 Header: map[string]string{ 253 "Content-Type": "application/json", 254 }, 255 Body: []byte(`{"message": "Hello World"}`), 256 } 257 258 if err := c.Send(&m); err != nil { 259 t.Errorf("Unexpected send err: %v", err) 260 } 261 262 <-done 263 } 264 265 func TestHTTPTransportMultipleSendWhenRecv(t *testing.T) { 266 tr := NewTransport() 267 268 l, err := tr.Listen("127.0.0.1:0") 269 if err != nil { 270 t.Errorf("Unexpected listen err: %v", err) 271 } 272 defer l.Close() 273 274 readyToSend := make(chan struct{}) 275 m := transport.Message{ 276 Header: map[string]string{ 277 "Content-Type": "application/json", 278 }, 279 Body: []byte(`{"message": "Hello World"}`), 280 } 281 282 wgSend := sync.WaitGroup{} 283 fn := func(sock transport.Socket) { 284 defer sock.Close() 285 286 for { 287 var mr transport.Message 288 if err := sock.Recv(&mr); err != nil { 289 return 290 } 291 wgSend.Add(1) 292 go func() { 293 defer wgSend.Done() 294 <-readyToSend 295 if err := sock.Send(&m); err != nil { 296 return 297 } 298 }() 299 } 300 } 301 302 done := make(chan bool) 303 304 go func() { 305 if err := l.Accept(fn); err != nil { 306 select { 307 case <-done: 308 default: 309 t.Errorf("Unexpected accept err: %v", err) 310 } 311 } 312 }() 313 314 c, err := tr.Dial(l.Addr(), transport.WithStream()) 315 if err != nil { 316 t.Errorf("Unexpected dial err: %v", err) 317 } 318 defer c.Close() 319 320 var wg sync.WaitGroup 321 wg.Add(1) 322 readyForRecv := make(chan struct{}) 323 go func() { 324 defer wg.Done() 325 close(readyForRecv) 326 for { 327 var rm transport.Message 328 if err := c.Recv(&rm); err != nil { 329 if err == io.EOF { 330 return 331 } 332 } 333 } 334 }() 335 <-readyForRecv 336 for i := 0; i < 3; i++ { 337 if err := c.Send(&m); err != nil { 338 t.Errorf("Unexpected send err: %v", err) 339 } 340 } 341 close(readyToSend) 342 wgSend.Wait() 343 close(done) 344 345 c.Close() 346 wg.Wait() 347 } 348 349 func TestHttpTransportListenerNetListener(t *testing.T) { 350 address := "127.0.0.1:0" 351 352 customListener, err := net.Listen("tcp", address) 353 if err != nil { 354 return 355 } 356 357 tr := NewTransport(transport.Timeout(time.Millisecond * 100)) 358 359 // injection 360 l, err := tr.Listen(address, NetListener(customListener)) 361 if err != nil { 362 t.Errorf("Unexpected listen err: %v", err) 363 } 364 defer l.Close() 365 366 done := make(chan bool) 367 368 fn := func(sock transport.Socket) { 369 defer func() { 370 sock.Close() 371 close(done) 372 }() 373 374 go func() { 375 select { 376 case <-done: 377 return 378 case <-time.After(time.Second): 379 t.Fatal("deadline not executed") 380 } 381 }() 382 383 for { 384 var m transport.Message 385 386 if err := sock.Recv(&m); err != nil { 387 return 388 } 389 } 390 } 391 392 go func() { 393 if err := l.Accept(fn); err != nil { 394 select { 395 case <-done: 396 default: 397 t.Errorf("Unexpected accept err: %v", err) 398 } 399 } 400 }() 401 402 c, err := tr.Dial(l.Addr()) 403 if err != nil { 404 t.Errorf("Unexpected dial err: %v", err) 405 } 406 defer c.Close() 407 408 m := transport.Message{ 409 Header: map[string]string{ 410 "Content-Type": "application/json", 411 }, 412 Body: []byte(`{"message": "Hello World"}`), 413 } 414 415 if err := c.Send(&m); err != nil { 416 t.Errorf("Unexpected send err: %v", err) 417 } 418 419 <-done 420 }