github.com/viant/toolbox@v0.34.5/bridge/http_bridge_test.go (about) 1 package bridge_test 2 3 import ( 4 "fmt" 5 "github.com/stretchr/testify/assert" 6 "github.com/viant/toolbox/bridge" 7 "io/ioutil" 8 "log" 9 "net" 10 "net/http" 11 "net/url" 12 "strings" 13 "testing" 14 "time" 15 ) 16 17 func startTargetProxyTestEndpoint(port string, responses map[string]string) error { 18 mux := http.NewServeMux() 19 listener, err := net.Listen("tcp", ":"+port) 20 if err != nil { 21 return err 22 } 23 mux.HandleFunc("/", func(response http.ResponseWriter, request *http.Request) { 24 25 if strings.ToUpper(request.Method) == "POST" { 26 response.WriteHeader(http.StatusOK) 27 data, err := ioutil.ReadAll(request.Body) 28 if err != nil { 29 log.Fatal(err) 30 } 31 response.Write(data) 32 return 33 } 34 35 if body, ok := responses[request.URL.Path]; ok { 36 response.WriteHeader(http.StatusOK) 37 response.Write([]byte(body)) 38 } else { 39 response.WriteHeader(http.StatusNotFound) 40 } 41 }) 42 go http.Serve(listener, mux) 43 return nil 44 } 45 46 func startTestHttpBridge(port string, factory bridge.HttpBridgeProxyHandlerFactory, routes ...*bridge.HttpBridgeProxyRoute) (map[string]http.Handler, error) { 47 config := &bridge.HttpBridgeConfig{ 48 Endpoint: &bridge.HttpBridgeEndpointConfig{ 49 Port: port, 50 }, 51 Proxy: &bridge.HttpBridgeProxyConfig{ 52 BufferPoolSize: 2, 53 BufferSize: 8 * 1024, 54 }, 55 Routes: routes, 56 } 57 httpBridge, err := bridge.NewHttpBridge(config, factory) 58 if err != nil { 59 return nil, err 60 } 61 go httpBridge.ListenAndServe() 62 return httpBridge.Handlers, nil 63 } 64 65 func TestNewHttpBridge(t *testing.T) { 66 67 for i := 0; i < 2; i++ { 68 responses := make(map[string]string) 69 responses[fmt.Sprintf("/test%v", i+1)] = fmt.Sprintf("Response1 from %v", 8088+i) 70 err := startTargetProxyTestEndpoint(fmt.Sprintf("%v", 8088+i), responses) 71 assert.Nil(t, err) 72 } 73 74 routes := make([]*bridge.HttpBridgeProxyRoute, 0) 75 for i := 0; i < 2; i++ { 76 targetURL, err := url.Parse(fmt.Sprintf("http://127.0.0.1:%v/test%v", 8088+i, i+1)) 77 assert.Nil(t, err) 78 if err != nil { 79 log.Fatal(err) 80 } 81 route := &bridge.HttpBridgeProxyRoute{ 82 Pattern: fmt.Sprintf("/test%v", i+1), 83 TargetURL: targetURL, 84 } 85 routes = append(routes, route) 86 } 87 startTestHttpBridge("8085", bridge.NewProxyHandler, routes...) 88 89 time.Sleep(1 * time.Second) 90 //Test direct responses 91 for i := 0; i < 2; i++ { 92 response, err := http.Get(fmt.Sprintf("http://127.0.0.1:%v/test%v", 8088+i, i+1)) 93 assert.Nil(t, err) 94 content, err := ioutil.ReadAll(response.Body) 95 assert.Nil(t, err) 96 assert.Equal(t, fmt.Sprintf("Response1 from %v", 8088+i), string(content)) 97 98 } 99 100 //Test proxy responses 101 for i := 0; i < 2; i++ { 102 response, err := http.Get(fmt.Sprintf("http://127.0.0.1:8085/test%v", i+1)) 103 assert.Nil(t, err) 104 content, err := ioutil.ReadAll(response.Body) 105 assert.Nil(t, err) 106 assert.Equal(t, fmt.Sprintf("Response1 from %v", 8088+i), string(content)) 107 } 108 } 109 110 func TestNewHttpBridgeWithListeningHandler(t *testing.T) { 111 basePort := 9098 112 for i := 0; i < 2; i++ { 113 responses := make(map[string]string) 114 responses[fmt.Sprintf("/test%v", i+1)] = fmt.Sprintf("Response1 from %v", basePort+i) 115 err := startTargetProxyTestEndpoint(fmt.Sprintf("%v", basePort+i), responses) 116 assert.Nil(t, err) 117 } 118 119 var responses = make([]*http.Response, 0) 120 var listener = func(request *http.Request, response *http.Response) { 121 responses = append(responses, response) 122 } 123 routes := make([]*bridge.HttpBridgeProxyRoute, 0) 124 for i := 0; i < 2; i++ { 125 targetURL, err := url.Parse(fmt.Sprintf("http://127.0.0.1:%v/test%v", basePort+i, i+1)) 126 assert.Nil(t, err) 127 if err != nil { 128 log.Fatal(err) 129 } 130 route := &bridge.HttpBridgeProxyRoute{ 131 Pattern: fmt.Sprintf("/test%v", i+1), 132 TargetURL: targetURL, 133 Listener: listener, 134 } 135 routes = append(routes, route) 136 } 137 _, err := startTestHttpBridge("9085", bridge.NewProxyRecordingHandler, routes...) 138 assert.Nil(t, err) 139 140 time.Sleep(1 * time.Second) 141 142 //Test direct responses 143 for i := 0; i < 2; i++ { 144 response, err := http.Get(fmt.Sprintf("http://127.0.0.1:%v/test%v", basePort+i, i+1)) 145 assert.Nil(t, err) 146 content, err := ioutil.ReadAll(response.Body) 147 assert.Nil(t, err) 148 assert.Equal(t, fmt.Sprintf("Response1 from %v", basePort+i), string(content)) 149 150 } 151 152 //Test proxy responses 153 for i := 0; i < 2; i++ { 154 response, err := http.Get(fmt.Sprintf("http://127.0.0.1:9085/test%v", i+1)) 155 assert.Nil(t, err) 156 content, err := ioutil.ReadAll(response.Body) 157 assert.Nil(t, err) 158 assert.Equal(t, fmt.Sprintf("Response1 from %v", basePort+i), string(content)) 159 } 160 161 { 162 i := 0 163 response, err := http.Post(fmt.Sprintf("http://127.0.0.1:9085/test%v", i+1), "text/json", strings.NewReader("{\"a\":1}")) 164 assert.Nil(t, err) 165 content, err := ioutil.ReadAll(response.Body) 166 assert.Nil(t, err) 167 assert.Equal(t, "{\"a\":1}", string(content)) 168 } 169 170 { 171 assert.Equal(t, 3, len(responses)) 172 time.Sleep(1 * time.Second) 173 request := responses[0].Request 174 assert.Equal(t, "/test1", request.URL.Path) 175 176 response := responses[0] 177 content, err := ioutil.ReadAll(response.Body) 178 assert.Nil(t, err) 179 assert.Equal(t, "Response1 from 9098", string(content)) 180 181 response = responses[2] 182 content, err = ioutil.ReadAll(response.Body) 183 assert.Nil(t, err) 184 assert.Equal(t, "{\"a\":1}", string(content)) 185 } 186 187 } 188 189