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 }