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 ( ...@@ -11,8 +11,10 @@ import (
"time" "time"
) )
const goodResponse = "{\"jsonrpc\": \"2.0\", \"result\": \"hello\", \"id\": 999}" const (
const noBackendsResponse = "{\"error\":{\"code\":-32011,\"message\":\"no backends available for method\"},\"id\":999,\"jsonrpc\":\"2.0\"}" 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) { func TestFailover(t *testing.T) {
goodBackend := NewMockBackend(SingleResponseHandler(200, goodResponse)) goodBackend := NewMockBackend(SingleResponseHandler(200, goodResponse))
...@@ -82,7 +84,7 @@ func TestFailover(t *testing.T) { ...@@ -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) { badBackend.SetHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
time.Sleep(2 * time.Second) time.Sleep(2 * time.Second)
w.Write([]byte("{}")) w.Write([]byte("{}"))
...@@ -93,12 +95,11 @@ func TestFailover(t *testing.T) { ...@@ -93,12 +95,11 @@ func TestFailover(t *testing.T) {
RequireEqualJSON(t, []byte(goodResponse), res) RequireEqualJSON(t, []byte(goodResponse), res)
require.Equal(t, 1, len(badBackend.Requests())) require.Equal(t, 1, len(badBackend.Requests()))
require.Equal(t, 1, len(goodBackend.Requests())) require.Equal(t, 1, len(goodBackend.Requests()))
})
t.Run("works with a batch request", func(t *testing.T) {
goodBackend.Reset() goodBackend.Reset()
badBackend.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) { badBackend.SetHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(500) w.WriteHeader(500)
})) }))
...@@ -155,7 +156,7 @@ func TestRetries(t *testing.T) { ...@@ -155,7 +156,7 @@ func TestRetries(t *testing.T) {
func TestOutOfServiceInterval(t *testing.T) { func TestOutOfServiceInterval(t *testing.T) {
goodBackend := NewMockBackend(SingleResponseHandler(200, goodResponse)) goodBackend := NewMockBackend(SingleResponseHandler(200, goodResponse))
defer goodBackend.Close() defer goodBackend.Close()
badBackend := NewMockBackend(SingleResponseHandler(200, goodResponse)) badBackend := NewMockBackend(nil)
defer badBackend.Close() defer badBackend.Close()
require.NoError(t, os.Setenv("GOOD_BACKEND_RPC_URL", goodBackend.URL())) require.NoError(t, os.Setenv("GOOD_BACKEND_RPC_URL", goodBackend.URL()))
......
...@@ -9,12 +9,12 @@ import ( ...@@ -9,12 +9,12 @@ import (
) )
const ( const (
notWhitelistedResponse = "{\"jsonrpc\":\"2.0\",\"error\":{\"code\":-32001,\"message\":\"rpc method is not whitelisted\"},\"id\":999}" 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}" 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\"}" 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\"}" 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\"}" 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\"}" invalidBatchLenResponse = `{"error":{"code":-32601,"message":"must specify at least one batch call"},"id":null,"jsonrpc":"2.0"}`
) )
func TestSingleRPCValidation(t *testing.T) { func TestSingleRPCValidation(t *testing.T) {
......
...@@ -338,6 +338,7 @@ func writeRPCRes(ctx context.Context, w http.ResponseWriter, res *RPCRes) { ...@@ -338,6 +338,7 @@ func writeRPCRes(ctx context.Context, w http.ResponseWriter, res *RPCRes) {
statusCode = res.Error.HTTPErrorCode statusCode = res.Error.HTTPErrorCode
} }
w.Header().Set("content-type", "application/json")
w.WriteHeader(statusCode) w.WriteHeader(statusCode)
ww := &recordLenWriter{Writer: w} ww := &recordLenWriter{Writer: w}
enc := json.NewEncoder(ww) enc := json.NewEncoder(ww)
...@@ -351,6 +352,7 @@ func writeRPCRes(ctx context.Context, w http.ResponseWriter, res *RPCRes) { ...@@ -351,6 +352,7 @@ func writeRPCRes(ctx context.Context, w http.ResponseWriter, res *RPCRes) {
} }
func writeBatchRPCRes(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) w.WriteHeader(200)
ww := &recordLenWriter{Writer: w} ww := &recordLenWriter{Writer: w}
enc := json.NewEncoder(ww) 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