gitee.com/sasukebo/go-micro/v4@v4.7.1/transport/http_transport_test.go (about) 1 package transport 2 3 import ( 4 "io" 5 "net" 6 "sync" 7 "testing" 8 "time" 9 ) 10 11 func expectedPort(t *testing.T, expected string, lsn Listener) { 12 _, port, err := net.SplitHostPort(lsn.Addr()) 13 if err != nil { 14 t.Errorf("Expected address to be `%s`, got error: %v", expected, err) 15 } 16 17 if port != expected { 18 lsn.Close() 19 t.Errorf("Expected address to be `%s`, got `%s`", expected, port) 20 } 21 } 22 23 func TestHTTPTransportPortRange(t *testing.T) { 24 tp := NewHTTPTransport() 25 26 lsn1, err := tp.Listen(":44444-44448") 27 if err != nil { 28 t.Errorf("Did not expect an error, got %s", err) 29 } 30 expectedPort(t, "44444", lsn1) 31 32 lsn2, err := tp.Listen(":44444-44448") 33 if err != nil { 34 t.Errorf("Did not expect an error, got %s", err) 35 } 36 expectedPort(t, "44445", lsn2) 37 38 lsn, err := tp.Listen("127.0.0.1:0") 39 if err != nil { 40 t.Errorf("Did not expect an error, got %s", err) 41 } 42 43 lsn.Close() 44 lsn1.Close() 45 lsn2.Close() 46 } 47 48 func TestHTTPTransportCommunication(t *testing.T) { 49 tr := NewHTTPTransport() 50 51 l, err := tr.Listen("127.0.0.1:0") 52 if err != nil { 53 t.Errorf("Unexpected listen err: %v", err) 54 } 55 defer l.Close() 56 57 fn := func(sock Socket) { 58 defer sock.Close() 59 60 for { 61 var m Message 62 if err := sock.Recv(&m); err != nil { 63 return 64 } 65 66 if err := sock.Send(&m); err != nil { 67 return 68 } 69 } 70 } 71 72 done := make(chan bool) 73 74 go func() { 75 if err := l.Accept(fn); err != nil { 76 select { 77 case <-done: 78 default: 79 t.Errorf("Unexpected accept err: %v", err) 80 } 81 } 82 }() 83 84 c, err := tr.Dial(l.Addr()) 85 if err != nil { 86 t.Errorf("Unexpected dial err: %v", err) 87 } 88 defer c.Close() 89 90 m := Message{ 91 Header: map[string]string{ 92 "Content-Type": "application/json", 93 }, 94 Body: []byte(`{"message": "Hello World"}`), 95 } 96 97 if err := c.Send(&m); err != nil { 98 t.Errorf("Unexpected send err: %v", err) 99 } 100 101 var rm Message 102 103 if err := c.Recv(&rm); err != nil { 104 t.Errorf("Unexpected recv err: %v", err) 105 } 106 107 if string(rm.Body) != string(m.Body) { 108 t.Errorf("Expected %v, got %v", m.Body, rm.Body) 109 } 110 111 close(done) 112 } 113 114 func TestHTTPTransportError(t *testing.T) { 115 tr := NewHTTPTransport() 116 117 l, err := tr.Listen("127.0.0.1:0") 118 if err != nil { 119 t.Errorf("Unexpected listen err: %v", err) 120 } 121 defer l.Close() 122 123 fn := func(sock Socket) { 124 defer sock.Close() 125 126 for { 127 var m Message 128 if err := sock.Recv(&m); err != nil { 129 if err == io.EOF { 130 return 131 } 132 t.Fatal(err) 133 } 134 135 sock.(*httpTransportSocket).error(&Message{ 136 Body: []byte(`an error occurred`), 137 }) 138 } 139 } 140 141 done := make(chan bool) 142 143 go func() { 144 if err := l.Accept(fn); err != nil { 145 select { 146 case <-done: 147 default: 148 t.Errorf("Unexpected accept err: %v", err) 149 } 150 } 151 }() 152 153 c, err := tr.Dial(l.Addr()) 154 if err != nil { 155 t.Errorf("Unexpected dial err: %v", err) 156 } 157 defer c.Close() 158 159 m := Message{ 160 Header: map[string]string{ 161 "Content-Type": "application/json", 162 }, 163 Body: []byte(`{"message": "Hello World"}`), 164 } 165 166 if err := c.Send(&m); err != nil { 167 t.Errorf("Unexpected send err: %v", err) 168 } 169 170 var rm Message 171 172 err = c.Recv(&rm) 173 if err == nil { 174 t.Fatal("Expected error but got nil") 175 } 176 177 if err.Error() != "500 Internal Server Error: an error occurred" { 178 t.Fatalf("Did not receive expected error, got: %v", err) 179 } 180 181 close(done) 182 } 183 184 func TestHTTPTransportTimeout(t *testing.T) { 185 tr := NewHTTPTransport(Timeout(time.Millisecond * 100)) 186 187 l, err := tr.Listen("127.0.0.1:0") 188 if err != nil { 189 t.Errorf("Unexpected listen err: %v", err) 190 } 191 defer l.Close() 192 193 done := make(chan bool) 194 195 fn := func(sock Socket) { 196 defer func() { 197 sock.Close() 198 close(done) 199 }() 200 201 go func() { 202 select { 203 case <-done: 204 return 205 case <-time.After(time.Second): 206 t.Fatal("deadline not executed") 207 } 208 }() 209 210 for { 211 var m Message 212 213 if err := sock.Recv(&m); err != nil { 214 return 215 } 216 } 217 } 218 219 go func() { 220 if err := l.Accept(fn); err != nil { 221 select { 222 case <-done: 223 default: 224 t.Errorf("Unexpected accept err: %v", err) 225 } 226 } 227 }() 228 229 c, err := tr.Dial(l.Addr()) 230 if err != nil { 231 t.Errorf("Unexpected dial err: %v", err) 232 } 233 defer c.Close() 234 235 m := Message{ 236 Header: map[string]string{ 237 "Content-Type": "application/json", 238 }, 239 Body: []byte(`{"message": "Hello World"}`), 240 } 241 242 if err := c.Send(&m); err != nil { 243 t.Errorf("Unexpected send err: %v", err) 244 } 245 246 <-done 247 } 248 249 func TestHTTPTransportCloseWhenRecv(t *testing.T) { 250 tr := NewHTTPTransport() 251 252 l, err := tr.Listen("127.0.0.1:0") 253 if err != nil { 254 t.Errorf("Unexpected listen err: %v", err) 255 } 256 defer l.Close() 257 258 fn := func(sock Socket) { 259 defer sock.Close() 260 261 for { 262 var m Message 263 if err := sock.Recv(&m); err != nil { 264 return 265 } 266 if err := sock.Send(&m); err != nil { 267 return 268 } 269 } 270 } 271 272 done := make(chan bool) 273 274 go func() { 275 if err := l.Accept(fn); err != nil { 276 select { 277 case <-done: 278 default: 279 t.Errorf("Unexpected accept err: %v", err) 280 } 281 } 282 }() 283 284 c, err := tr.Dial(l.Addr()) 285 if err != nil { 286 t.Errorf("Unexpected dial err: %v", err) 287 } 288 defer c.Close() 289 290 m := Message{ 291 Header: map[string]string{ 292 "Content-Type": "application/json", 293 }, 294 Body: []byte(`{"message": "Hello World"}`), 295 } 296 var wg sync.WaitGroup 297 wg.Add(1) 298 go func() { 299 defer wg.Done() 300 for { 301 var rm Message 302 303 if err := c.Recv(&rm); err != nil { 304 if err == io.EOF { 305 c.Recv(&rm) 306 return 307 } 308 t.Errorf("Unexpected recv err: %v", err) 309 } 310 } 311 }() 312 for i := 1; i < 3; i++ { 313 if err := c.Send(&m); err != nil { 314 t.Errorf("Unexpected send err: %v", err) 315 } 316 } 317 close(done) 318 319 c.Close() 320 wg.Wait() 321 }