Commit 1760613c authored by Matthew Slipper's avatar Matthew Slipper

Code review updates

- Fixes ENG-1903
parent 594893df
---
'@eth-optimism/proxyd': minor
---
Add integration tests and batching
......@@ -11,8 +11,10 @@ import (
"time"
)
const goodResponse = "{\"jsonrpc\": \"2.0\", \"result\": \"hello\", \"id\": 999}"
const noBackendsResponse = "{\"error\":{\"code\":-32011,\"message\":\"no backends available for method\"},\"id\":999,\"jsonrpc\":\"2.0\"}"
const (
goodResponse = `{"jsonrpc": "2.0", "result": "hello", "id": 999}`
noBackendsResponse = `{"error":{"code":-32011,"message":"no backends available for method"},"id":999,"jsonrpc":"2.0"}`
)
func TestFailover(t *testing.T) {
goodBackend := NewMockBackend(SingleResponseHandler(200, goodResponse))
......@@ -82,7 +84,7 @@ func TestFailover(t *testing.T) {
})
}
t.Run("backend times out", func(t *testing.T) {
t.Run("backend times out and falls back to another", func(t *testing.T) {
badBackend.SetHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
time.Sleep(2 * time.Second)
w.Write([]byte("{}"))
......@@ -93,12 +95,11 @@ func TestFailover(t *testing.T) {
RequireEqualJSON(t, []byte(goodResponse), res)
require.Equal(t, 1, len(badBackend.Requests()))
require.Equal(t, 1, len(goodBackend.Requests()))
})
t.Run("works with a batch request", func(t *testing.T) {
goodBackend.Reset()
badBackend.Reset()
})
t.Run("works with a batch request", func(t *testing.T) {
badBackend.SetHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(500)
}))
......@@ -155,7 +156,7 @@ func TestRetries(t *testing.T) {
func TestOutOfServiceInterval(t *testing.T) {
goodBackend := NewMockBackend(SingleResponseHandler(200, goodResponse))
defer goodBackend.Close()
badBackend := NewMockBackend(SingleResponseHandler(200, goodResponse))
badBackend := NewMockBackend(nil)
defer badBackend.Close()
require.NoError(t, os.Setenv("GOOD_BACKEND_RPC_URL", goodBackend.URL()))
......
......@@ -9,12 +9,12 @@ import (
)
const (
notWhitelistedResponse = "{\"jsonrpc\":\"2.0\",\"error\":{\"code\":-32001,\"message\":\"rpc method is not whitelisted\"},\"id\":999}"
parseErrResponse = "{\"jsonrpc\":\"2.0\",\"error\":{\"code\":-32700,\"message\":\"parse error\"},\"id\":null}"
invalidJSONRPCVersionResponse = "{\"error\":{\"code\":-32601,\"message\":\"invalid JSON-RPC version\"},\"id\":null,\"jsonrpc\":\"2.0\"}"
invalidIDResponse = "{\"error\":{\"code\":-32601,\"message\":\"invalid ID\"},\"id\":null,\"jsonrpc\":\"2.0\"}"
invalidMethodResponse = "{\"error\":{\"code\":-32601,\"message\":\"no method specified\"},\"id\":null,\"jsonrpc\":\"2.0\"}"
invalidBatchLenResponse = "{\"error\":{\"code\":-32601,\"message\":\"must specify at least one batch call\"},\"id\":null,\"jsonrpc\":\"2.0\"}"
notWhitelistedResponse = `{"jsonrpc":"2.0","error":{"code":-32001,"message":"rpc method is not whitelisted"},"id":999}`
parseErrResponse = `{"jsonrpc":"2.0","error":{"code":-32700,"message":"parse error"},"id":null}`
invalidJSONRPCVersionResponse = `{"error":{"code":-32601,"message":"invalid JSON-RPC version"},"id":null,"jsonrpc":"2.0"}`
invalidIDResponse = `{"error":{"code":-32601,"message":"invalid ID"},"id":null,"jsonrpc":"2.0"}`
invalidMethodResponse = `{"error":{"code":-32601,"message":"no method specified"},"id":null,"jsonrpc":"2.0"}`
invalidBatchLenResponse = `{"error":{"code":-32601,"message":"must specify at least one batch call"},"id":null,"jsonrpc":"2.0"}`
)
func TestSingleRPCValidation(t *testing.T) {
......
......@@ -338,6 +338,7 @@ func writeRPCRes(ctx context.Context, w http.ResponseWriter, res *RPCRes) {
statusCode = res.Error.HTTPErrorCode
}
w.Header().Set("content-type", "application/json")
w.WriteHeader(statusCode)
ww := &recordLenWriter{Writer: w}
enc := json.NewEncoder(ww)
......@@ -351,6 +352,7 @@ func writeRPCRes(ctx context.Context, w http.ResponseWriter, res *RPCRes) {
}
func writeBatchRPCRes(ctx context.Context, w http.ResponseWriter, res []*RPCRes) {
w.Header().Set("content-type", "application/json")
w.WriteHeader(200)
ww := &recordLenWriter{Writer: w}
enc := json.NewEncoder(ww)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment