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