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