github.com/webonyx/up@v0.7.4-0.20180808230834-91b94e551323/http/relay/relay_test.go (about)

     1  package relay
     2  
     3  import (
     4  	"net/http"
     5  	"net/http/httptest"
     6  	"os"
     7  	"strings"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/tj/assert"
    12  
    13  	"github.com/apex/up"
    14  	"github.com/apex/up/config"
    15  	"github.com/apex/up/internal/util"
    16  )
    17  
    18  func skipCI(t testing.TB) {
    19  	if util.IsCI() {
    20  		t.SkipNow()
    21  	}
    22  }
    23  
    24  func TestRelay(t *testing.T) {
    25  	os.Chdir("testdata/basic")
    26  	defer os.Chdir("../..")
    27  
    28  	c := &up.Config{
    29  		Proxy: config.Relay{
    30  			Timeout:       2,
    31  			ListenTimeout: 2,
    32  		},
    33  	}
    34  
    35  	assert.NoError(t, c.Default(), "default")
    36  
    37  	var h http.Handler
    38  	newHandler := func(t *testing.T) {
    39  		v, err := New(c)
    40  		assert.NoError(t, err, "init")
    41  		h = v
    42  	}
    43  
    44  	t.Run("GET simple", func(t *testing.T) {
    45  		newHandler(t)
    46  
    47  		res := httptest.NewRecorder()
    48  		req := httptest.NewRequest("GET", "/hello", nil)
    49  		h.ServeHTTP(res, req)
    50  
    51  		assert.Equal(t, 200, res.Code)
    52  		assert.Equal(t, "text/plain", res.Header().Get("Content-Type"))
    53  		assert.Equal(t, "Hello World", res.Body.String())
    54  	})
    55  
    56  	t.Run("GET encoded path", func(t *testing.T) {
    57  		newHandler(t)
    58  
    59  		res := httptest.NewRecorder()
    60  		req := httptest.NewRequest("GET", "/echo/01BM82CJ9K1WK6EFJX8C1R4YH7/foo%20%25%20bar%20&%20baz%20=%20raz", nil)
    61  		req.Header.Set("Host", "example.com")
    62  		req.Header.Set("User-Agent", "tobi")
    63  		h.ServeHTTP(res, req)
    64  
    65  		body := `{
    66    "header": {
    67      "host": "example.com",
    68      "user-agent": "tobi",
    69      "x-forwarded-for": "192.0.2.1",
    70      "accept-encoding": "gzip",
    71      "connection": "close"
    72    },
    73    "url": "/echo/01BM82CJ9K1WK6EFJX8C1R4YH7/foo%20%25%20bar%20&%20baz%20=%20raz",
    74    "body": ""
    75  }`
    76  
    77  		assert.Equal(t, 200, res.Code)
    78  		assert.Equal(t, "application/json", res.Header().Get("Content-Type"))
    79  		assertString(t, body, res.Body.String())
    80  	})
    81  
    82  	t.Run("POST simple", func(t *testing.T) {
    83  		newHandler(t)
    84  
    85  		res := httptest.NewRecorder()
    86  		req := httptest.NewRequest("POST", "/echo/something", strings.NewReader("Some body here"))
    87  		h.ServeHTTP(res, req)
    88  
    89  		body := `{
    90    "header": {
    91      "host": "example.com",
    92      "content-length": "14",
    93      "x-forwarded-for": "192.0.2.1",
    94      "accept-encoding": "gzip",
    95      "connection": "close"
    96    },
    97    "url": "/echo/something",
    98    "body": "Some body here"
    99  }`
   100  
   101  		assert.Equal(t, 200, res.Code)
   102  		assert.Equal(t, "application/json", res.Header().Get("Content-Type"))
   103  		assertString(t, body, res.Body.String())
   104  	})
   105  
   106  	t.Run("crash", func(t *testing.T) {
   107  		newHandler(t)
   108  
   109  		// first
   110  		res := httptest.NewRecorder()
   111  		req := httptest.NewRequest("GET", "/throw", nil)
   112  		h.ServeHTTP(res, req)
   113  
   114  		assert.Equal(t, 502, res.Code)
   115  		assertString(t, "", res.Body.String())
   116  
   117  		// wait for restart
   118  		time.Sleep(time.Second)
   119  
   120  		// second
   121  		res = httptest.NewRecorder()
   122  		req = httptest.NewRequest("GET", "/hello", nil)
   123  		h.ServeHTTP(res, req)
   124  
   125  		assert.Equal(t, 200, res.Code)
   126  		assertString(t, "Hello World", res.Body.String())
   127  	})
   128  
   129  	t.Run("timeout", func(t *testing.T) {
   130  		newHandler(t)
   131  
   132  		// first
   133  		res := httptest.NewRecorder()
   134  		req := httptest.NewRequest("GET", "/timeout", nil)
   135  		h.ServeHTTP(res, req)
   136  
   137  		assert.Equal(t, 502, res.Code)
   138  		assertString(t, "", res.Body.String())
   139  
   140  		// second
   141  		res = httptest.NewRecorder()
   142  		req = httptest.NewRequest("GET", "/hello", nil)
   143  		h.ServeHTTP(res, req)
   144  
   145  		assert.Equal(t, 200, res.Code)
   146  		assertString(t, "Hello World", res.Body.String())
   147  	})
   148  }
   149  
   150  func assertString(t testing.TB, want, got string) {
   151  	t.Helper()
   152  	if want != got {
   153  		t.Fatalf("\nwant:\n\n%s\n\ngot:\n\n%s\n", want, got)
   154  	}
   155  }