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