Add integration tests for nghttpx API endpoint
This commit is contained in:
parent
4ef3f9d11c
commit
8248598601
|
@ -2,6 +2,7 @@ package nghttp2
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"golang.org/x/net/http2"
|
"golang.org/x/net/http2"
|
||||||
"golang.org/x/net/http2/hpack"
|
"golang.org/x/net/http2/hpack"
|
||||||
|
@ -1843,3 +1844,114 @@ func TestH2H2RespPhaseReturn(t *testing.T) {
|
||||||
t.Errorf("body = %v; want %v", got, want)
|
t.Errorf("body = %v; want %v", got, want)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestH2APIBackendReplace exercise backend/replace API endpoint
|
||||||
|
// routine for successful case.
|
||||||
|
func TestH2APIBackendReplace(t *testing.T) {
|
||||||
|
st := newServerTesterConnectPort([]string{"-f127.0.0.1,3010;api;no-tls"}, t, func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
t.Fatalf("request should not be forwarded")
|
||||||
|
}, 3010)
|
||||||
|
defer st.Close()
|
||||||
|
|
||||||
|
res, err := st.http2(requestParam{
|
||||||
|
name: "TestH2APIBackendReplace",
|
||||||
|
path: "/api/v1beta1/backend/replace",
|
||||||
|
method: "PUT",
|
||||||
|
body: []byte(`# comment
|
||||||
|
backend=127.0.0.1,3011
|
||||||
|
|
||||||
|
`),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Error st.http2() = %v", err)
|
||||||
|
}
|
||||||
|
if got, want := res.status, 200; got != want {
|
||||||
|
t.Errorf("res.status: %v; want %v", got, want)
|
||||||
|
}
|
||||||
|
|
||||||
|
var apiResp APIResponse
|
||||||
|
err = json.Unmarshal(res.body, &apiResp)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Error unmarshaling API response: %v", err)
|
||||||
|
}
|
||||||
|
if got, want := apiResp.Status, "Success"; got != want {
|
||||||
|
t.Errorf("apiResp.Status: %v; want %v", got, want)
|
||||||
|
}
|
||||||
|
if got, want := apiResp.Code, 200; got != want {
|
||||||
|
t.Errorf("apiResp.Status: %v; want %v", got, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestH2APIBackendReplaceBadMethod exercise backend/replace API
|
||||||
|
// endpoint routine with bad method.
|
||||||
|
func TestH2APIBackendReplaceBadMethod(t *testing.T) {
|
||||||
|
st := newServerTesterConnectPort([]string{"-f127.0.0.1,3010;api;no-tls"}, t, func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
t.Fatalf("request should not be forwarded")
|
||||||
|
}, 3010)
|
||||||
|
defer st.Close()
|
||||||
|
|
||||||
|
res, err := st.http2(requestParam{
|
||||||
|
name: "TestH2APIBackendReplaceBadMethod",
|
||||||
|
path: "/api/v1beta1/backend/replace",
|
||||||
|
method: "GET",
|
||||||
|
body: []byte(`# comment
|
||||||
|
backend=127.0.0.1,3011
|
||||||
|
|
||||||
|
`),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Error st.http2() = %v", err)
|
||||||
|
}
|
||||||
|
if got, want := res.status, 405; got != want {
|
||||||
|
t.Errorf("res.status: %v; want %v", got, want)
|
||||||
|
}
|
||||||
|
|
||||||
|
var apiResp APIResponse
|
||||||
|
err = json.Unmarshal(res.body, &apiResp)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Error unmarshaling API response: %v", err)
|
||||||
|
}
|
||||||
|
if got, want := apiResp.Status, "Failure"; got != want {
|
||||||
|
t.Errorf("apiResp.Status: %v; want %v", got, want)
|
||||||
|
}
|
||||||
|
if got, want := apiResp.Code, 405; got != want {
|
||||||
|
t.Errorf("apiResp.Status: %v; want %v", got, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestH2APINotFound exercise backend/replace API endpoint routine
|
||||||
|
// when API endpoint is not found.
|
||||||
|
func TestH2APINotFound(t *testing.T) {
|
||||||
|
st := newServerTesterConnectPort([]string{"-f127.0.0.1,3010;api;no-tls"}, t, func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
t.Fatalf("request should not be forwarded")
|
||||||
|
}, 3010)
|
||||||
|
defer st.Close()
|
||||||
|
|
||||||
|
res, err := st.http2(requestParam{
|
||||||
|
name: "TestH2APINotFound",
|
||||||
|
path: "/api/notfound",
|
||||||
|
method: "GET",
|
||||||
|
body: []byte(`# comment
|
||||||
|
backend=127.0.0.1,3011
|
||||||
|
|
||||||
|
`),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Error st.http2() = %v", err)
|
||||||
|
}
|
||||||
|
if got, want := res.status, 404; got != want {
|
||||||
|
t.Errorf("res.status: %v; want %v", got, want)
|
||||||
|
}
|
||||||
|
|
||||||
|
var apiResp APIResponse
|
||||||
|
err = json.Unmarshal(res.body, &apiResp)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Error unmarshaling API response: %v", err)
|
||||||
|
}
|
||||||
|
if got, want := apiResp.Status, "Failure"; got != want {
|
||||||
|
t.Errorf("apiResp.Status: %v; want %v", got, want)
|
||||||
|
}
|
||||||
|
if got, want := apiResp.Code, 404; got != want {
|
||||||
|
t.Errorf("apiResp.Status: %v; want %v", got, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -66,27 +66,32 @@ type serverTester struct {
|
||||||
// newServerTester creates test context for plain TCP frontend
|
// newServerTester creates test context for plain TCP frontend
|
||||||
// connection.
|
// connection.
|
||||||
func newServerTester(args []string, t *testing.T, handler http.HandlerFunc) *serverTester {
|
func newServerTester(args []string, t *testing.T, handler http.HandlerFunc) *serverTester {
|
||||||
return newServerTesterInternal(args, t, handler, false, nil)
|
return newServerTesterInternal(args, t, handler, false, serverPort, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func newServerTesterConnectPort(args []string, t *testing.T, handler http.HandlerFunc, port int) *serverTester {
|
||||||
|
return newServerTesterInternal(args, t, handler, false, port, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
func newServerTesterHandler(args []string, t *testing.T, handler http.Handler) *serverTester {
|
func newServerTesterHandler(args []string, t *testing.T, handler http.Handler) *serverTester {
|
||||||
return newServerTesterInternal(args, t, handler, false, nil)
|
return newServerTesterInternal(args, t, handler, false, serverPort, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// newServerTester creates test context for TLS frontend connection.
|
// newServerTester creates test context for TLS frontend connection.
|
||||||
func newServerTesterTLS(args []string, t *testing.T, handler http.HandlerFunc) *serverTester {
|
func newServerTesterTLS(args []string, t *testing.T, handler http.HandlerFunc) *serverTester {
|
||||||
return newServerTesterInternal(args, t, handler, true, nil)
|
return newServerTesterInternal(args, t, handler, true, serverPort, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// newServerTester creates test context for TLS frontend connection
|
// newServerTester creates test context for TLS frontend connection
|
||||||
// with given clientConfig
|
// with given clientConfig
|
||||||
func newServerTesterTLSConfig(args []string, t *testing.T, handler http.HandlerFunc, clientConfig *tls.Config) *serverTester {
|
func newServerTesterTLSConfig(args []string, t *testing.T, handler http.HandlerFunc, clientConfig *tls.Config) *serverTester {
|
||||||
return newServerTesterInternal(args, t, handler, true, clientConfig)
|
return newServerTesterInternal(args, t, handler, true, serverPort, clientConfig)
|
||||||
}
|
}
|
||||||
|
|
||||||
// newServerTesterInternal creates test context. If frontendTLS is
|
// newServerTesterInternal creates test context. If frontendTLS is
|
||||||
// true, set up TLS frontend connection.
|
// true, set up TLS frontend connection. connectPort is the server
|
||||||
func newServerTesterInternal(src_args []string, t *testing.T, handler http.Handler, frontendTLS bool, clientConfig *tls.Config) *serverTester {
|
// side port where client connection is made.
|
||||||
|
func newServerTesterInternal(src_args []string, t *testing.T, handler http.Handler, frontendTLS bool, connectPort int, clientConfig *tls.Config) *serverTester {
|
||||||
ts := httptest.NewUnstartedServer(handler)
|
ts := httptest.NewUnstartedServer(handler)
|
||||||
|
|
||||||
args := []string{}
|
args := []string{}
|
||||||
|
@ -138,7 +143,7 @@ func newServerTesterInternal(src_args []string, t *testing.T, handler http.Handl
|
||||||
args = append(args, fmt.Sprintf("-f127.0.0.1,%v;%v", serverPort, noTLS), b,
|
args = append(args, fmt.Sprintf("-f127.0.0.1,%v;%v", serverPort, noTLS), b,
|
||||||
"--errorlog-file="+logDir+"/log.txt", "-LINFO")
|
"--errorlog-file="+logDir+"/log.txt", "-LINFO")
|
||||||
|
|
||||||
authority := fmt.Sprintf("127.0.0.1:%v", serverPort)
|
authority := fmt.Sprintf("127.0.0.1:%v", connectPort)
|
||||||
|
|
||||||
st := &serverTester{
|
st := &serverTester{
|
||||||
cmd: exec.Command(serverBin, args...),
|
cmd: exec.Command(serverBin, args...),
|
||||||
|
@ -170,7 +175,7 @@ func newServerTesterInternal(src_args []string, t *testing.T, handler http.Handl
|
||||||
tlsConfig = clientConfig
|
tlsConfig = clientConfig
|
||||||
}
|
}
|
||||||
tlsConfig.InsecureSkipVerify = true
|
tlsConfig.InsecureSkipVerify = true
|
||||||
tlsConfig.NextProtos = []string{"h2-14", "spdy/3.1"}
|
tlsConfig.NextProtos = []string{"h2", "spdy/3.1"}
|
||||||
conn, err = tls.Dial("tcp", authority, tlsConfig)
|
conn, err = tls.Dial("tcp", authority, tlsConfig)
|
||||||
} else {
|
} else {
|
||||||
conn, err = net.Dial("tcp", authority)
|
conn, err = net.Dial("tcp", authority)
|
||||||
|
@ -746,3 +751,8 @@ func cloneHeader(h http.Header) http.Header {
|
||||||
}
|
}
|
||||||
|
|
||||||
func noopHandler(w http.ResponseWriter, r *http.Request) {}
|
func noopHandler(w http.ResponseWriter, r *http.Request) {}
|
||||||
|
|
||||||
|
type APIResponse struct {
|
||||||
|
Status string `json:"status,omitempty"`
|
||||||
|
Code int `json:"code,omitempty"`
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue