Skip to content

Commit

Permalink
JSONRPC L1/L2 Parity tests (0xPolygonHermez#1258)
Browse files Browse the repository at this point in the history
  • Loading branch information
KonradIT authored Oct 25, 2022
1 parent b7ca133 commit 195207e
Show file tree
Hide file tree
Showing 17 changed files with 669 additions and 174 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/test-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
matrix:
go-version: [ 1.17.x ]
goarch: [ "amd64" ]
e2e-group: [ 2 ]
e2e-group: [ 1, 2, 3 ]
runs-on: ubuntu-latest
steps:
- name: Checkout code
Expand Down Expand Up @@ -57,7 +57,7 @@ jobs:
matrix:
go-version: [ 1.17.x ]
goarch: [ "amd64" ]
e2e-group: [ 2 ]
e2e-group: [ 1, 2, 3 ]
runs-on: ubuntu-latest
steps:
- name: Fork based /ok-to-test checkout
Expand Down
File renamed without changes.
1 change: 1 addition & 0 deletions ci/e2e-group1/shared.go
1 change: 0 additions & 1 deletion ci/e2e-group1/state_test.go

This file was deleted.

1 change: 1 addition & 0 deletions ci/e2e-group2/jsonrpc_test.go
File renamed without changes.
1 change: 1 addition & 0 deletions ci/e2e-group3/shared.go
1 change: 0 additions & 1 deletion ci/e2e-group3/uniswap_test.go

This file was deleted.

6 changes: 4 additions & 2 deletions jsonrpc/eth.go
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ func (e *Eth) GetCompilers() (interface{}, rpcError) {
func (e *Eth) GetFilterChanges(filterID argUint64) (interface{}, rpcError) {
filter, err := e.storage.GetFilter(uint64(filterID))
if errors.Is(err, ErrNotFound) {
return nil, nil
return rpcErrorResponse(defaultErrorCode, "filter not found", err)
} else if err != nil {
return rpcErrorResponse(defaultErrorCode, "failed to get filter from storage", err)
}
Expand Down Expand Up @@ -577,7 +577,9 @@ func (e *Eth) NewBlockFilter() (interface{}, rpcError) {
// has changed, call eth_getFilterChanges.
func (e *Eth) NewFilter(filter *LogFilter) (interface{}, rpcError) {
id, err := e.storage.NewLogFilter(*filter)
if err != nil {
if errors.Is(err, ErrFilterInvalidPayload) {
return rpcErrorResponse(invalidParamsErrorCode, err.Error(), nil)
} else if err != nil {
return rpcErrorResponse(defaultErrorCode, "failed to create new log filter", err)
}

Expand Down
49 changes: 38 additions & 11 deletions jsonrpc/eth_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2968,6 +2968,8 @@ func TestNewFilter(t *testing.T) {
SetupMocks func(m *mocks, tc testCase)
}

hash := common.HexToHash("0x42")
blockNumber := BlockNumber(8)
testCases := []testCase{
{
Name: "New filter created successfully",
Expand All @@ -2993,6 +2995,21 @@ func TestNewFilter(t *testing.T) {
Once()
},
},
{
Name: "failed to create new filter because BlockHash and ToBlock are present",
LogFilter: &LogFilter{
BlockHash: &hash,
ToBlock: &blockNumber,
},
ExpectedResult: argUint64(0),
ExpectedError: newRPCError(invalidParamsErrorCode, "invalid argument 0: cannot specify both BlockHash and FromBlock/ToBlock, choose one or the other"),
SetupMocks: func(m *mocks, tc testCase) {
m.Storage.
On("NewLogFilter", *tc.LogFilter).
Return(uint64(0), ErrFilterInvalidPayload).
Once()
},
},
}

for _, testCase := range testCases {
Expand Down Expand Up @@ -3420,8 +3437,11 @@ func TestGetFilterLogs(t *testing.T) {
logs = append(logs, &l)
}

bn1 := BlockNumber(1)
bn2 := BlockNumber(2)
logFilter := LogFilter{
FromBlock: BlockNumber(1), ToBlock: BlockNumber(2),
FromBlock: &bn1,
ToBlock: &bn2,
Addresses: []common.Address{common.HexToAddress("0x111")},
Topics: [][]common.Hash{{common.HexToHash("0x222")}},
}
Expand Down Expand Up @@ -3453,7 +3473,7 @@ func TestGetFilterLogs(t *testing.T) {
Once()

m.State.
On("GetLogs", context.Background(), uint64(logFilter.FromBlock), uint64(logFilter.ToBlock), logFilter.Addresses, logFilter.Topics, logFilter.BlockHash, since, m.DbTx).
On("GetLogs", context.Background(), uint64(*logFilter.FromBlock), uint64(*logFilter.ToBlock), logFilter.Addresses, logFilter.Topics, logFilter.BlockHash, since, m.DbTx).
Return(logs, nil).
Once()
},
Expand Down Expand Up @@ -3797,8 +3817,10 @@ func TestGetFilterChanges(t *testing.T) {
tc.ExpectedErrors = append(tc.ExpectedErrors, nil)
},
SetupMocks: func(t *testing.T, m *mocks, tc testCase) {
bn1 := BlockNumber(1)
bn2 := BlockNumber(2)
logFilter := LogFilter{
FromBlock: BlockNumber(1), ToBlock: BlockNumber(2),
FromBlock: &bn1, ToBlock: &bn2,
Addresses: []common.Address{common.HexToAddress("0x111")},
Topics: [][]common.Hash{{common.HexToHash("0x222")}},
}
Expand Down Expand Up @@ -3837,7 +3859,7 @@ func TestGetFilterChanges(t *testing.T) {
}

m.State.
On("GetLogs", context.Background(), uint64(logFilter.FromBlock), uint64(logFilter.ToBlock), logFilter.Addresses, logFilter.Topics, logFilter.BlockHash, &filter.LastPoll, m.DbTx).
On("GetLogs", context.Background(), uint64(*logFilter.FromBlock), uint64(*logFilter.ToBlock), logFilter.Addresses, logFilter.Topics, logFilter.BlockHash, &filter.LastPoll, m.DbTx).
Return(logs, nil).
Once()

Expand Down Expand Up @@ -3869,7 +3891,7 @@ func TestGetFilterChanges(t *testing.T) {
}

m.State.
On("GetLogs", context.Background(), uint64(logFilter.FromBlock), uint64(logFilter.ToBlock), logFilter.Addresses, logFilter.Topics, logFilter.BlockHash, &filter.LastPoll, m.DbTx).
On("GetLogs", context.Background(), uint64(*logFilter.FromBlock), uint64(*logFilter.ToBlock), logFilter.Addresses, logFilter.Topics, logFilter.BlockHash, &filter.LastPoll, m.DbTx).
Return(logs, nil).
Once()

Expand All @@ -3893,7 +3915,7 @@ func TestGetFilterChanges(t *testing.T) {
Once()

m.State.
On("GetLogs", context.Background(), uint64(logFilter.FromBlock), uint64(logFilter.ToBlock), logFilter.Addresses, logFilter.Topics, logFilter.BlockHash, &filter.LastPoll, m.DbTx).
On("GetLogs", context.Background(), uint64(*logFilter.FromBlock), uint64(*logFilter.ToBlock), logFilter.Addresses, logFilter.Topics, logFilter.BlockHash, &filter.LastPoll, m.DbTx).
Return([]*types.Log{}, nil).
Once()

Expand All @@ -3915,7 +3937,7 @@ func TestGetFilterChanges(t *testing.T) {
tc.FilterID = argUint64(1)
// first call
tc.ExpectedResults = append(tc.ExpectedResults, nil)
tc.ExpectedErrors = append(tc.ExpectedErrors, nil)
tc.ExpectedErrors = append(tc.ExpectedErrors, newRPCError(defaultErrorCode, "filter not found"))
},
SetupMocks: func(t *testing.T, m *mocks, tc testCase) {
m.Storage.
Expand Down Expand Up @@ -4112,8 +4134,11 @@ func TestGetFilterChanges(t *testing.T) {
tc.ExpectedErrors = append(tc.ExpectedErrors, newRPCError(defaultErrorCode, "failed to get logs from state"))
},
SetupMocks: func(t *testing.T, m *mocks, tc testCase) {
bn1 := BlockNumber(1)
bn2 := BlockNumber(2)
logFilter := LogFilter{
FromBlock: BlockNumber(1), ToBlock: BlockNumber(2),

FromBlock: &bn1, ToBlock: &bn2,
Addresses: []common.Address{common.HexToAddress("0x111")},
Topics: [][]common.Hash{{common.HexToHash("0x222")}},
}
Expand Down Expand Up @@ -4145,7 +4170,7 @@ func TestGetFilterChanges(t *testing.T) {
Once()

m.State.
On("GetLogs", context.Background(), uint64(logFilter.FromBlock), uint64(logFilter.ToBlock), logFilter.Addresses, logFilter.Topics, logFilter.BlockHash, &filter.LastPoll, m.DbTx).
On("GetLogs", context.Background(), uint64(*logFilter.FromBlock), uint64(*logFilter.ToBlock), logFilter.Addresses, logFilter.Topics, logFilter.BlockHash, &filter.LastPoll, m.DbTx).
Return(nil, errors.New("failed to get logs")).
Once()
},
Expand All @@ -4158,8 +4183,10 @@ func TestGetFilterChanges(t *testing.T) {
tc.ExpectedErrors = append(tc.ExpectedErrors, newRPCError(defaultErrorCode, "failed to update last time the filter changes were requested"))
},
SetupMocks: func(t *testing.T, m *mocks, tc testCase) {
bn1 := BlockNumber(1)
bn2 := BlockNumber(2)
logFilter := LogFilter{
FromBlock: BlockNumber(1), ToBlock: BlockNumber(2),
FromBlock: &bn1, ToBlock: &bn2,
Addresses: []common.Address{common.HexToAddress("0x111")},
Topics: [][]common.Hash{{common.HexToHash("0x222")}},
}
Expand Down Expand Up @@ -4192,7 +4219,7 @@ func TestGetFilterChanges(t *testing.T) {
Once()

m.State.
On("GetLogs", context.Background(), uint64(logFilter.FromBlock), uint64(logFilter.ToBlock), logFilter.Addresses, logFilter.Topics, logFilter.BlockHash, &filter.LastPoll, m.DbTx).
On("GetLogs", context.Background(), uint64(*logFilter.FromBlock), uint64(*logFilter.ToBlock), logFilter.Addresses, logFilter.Topics, logFilter.BlockHash, &filter.LastPoll, m.DbTx).
Return([]*types.Log{}, nil).
Once()

Expand Down
6 changes: 6 additions & 0 deletions jsonrpc/pgstorage.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ const (
// ErrNotFound represent a not found error.
var ErrNotFound = errors.New("object not found")

// ErrFilterInvalidPayload indicates there is an invalid payload when creating a filter
var ErrFilterInvalidPayload = errors.New("invalid argument 0: cannot specify both BlockHash and FromBlock/ToBlock, choose one or the other")

// PostgresStorage uses a postgres database to store the data
// related to the json rpc server
type PostgresStorage struct {
Expand All @@ -43,6 +46,9 @@ func NewPostgresStorage(cfg db.Config) (*PostgresStorage, error) {

// NewLogFilter persists a new log filter
func (s *PostgresStorage) NewLogFilter(filter LogFilter) (uint64, error) {
if filter.BlockHash != nil && (filter.FromBlock != nil || filter.ToBlock != nil) {
return 0, ErrFilterInvalidPayload
}
parametersBytes, err := json.Marshal(&filter)
if err != nil {
return 0, err
Expand Down
49 changes: 29 additions & 20 deletions jsonrpc/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,17 @@ type Filter struct {
// LogFilterRequest represents a log filter request.
type LogFilterRequest struct {
BlockHash *common.Hash `json:"blockHash,omitempty"`
FromBlock string `json:"fromBlock,omitempty"`
ToBlock string `json:"toBlock,omitempty"`
FromBlock *string `json:"fromBlock,omitempty"`
ToBlock *string `json:"toBlock,omitempty"`
Address interface{} `json:"address,omitempty"`
Topics []interface{} `json:"topics,omitempty"`
}

// LogFilter is a filter for logs
type LogFilter struct {
BlockHash *common.Hash
FromBlock BlockNumber
ToBlock BlockNumber
FromBlock *BlockNumber
ToBlock *BlockNumber
Addresses []common.Address
Topics [][]common.Hash
Since *time.Time
Expand Down Expand Up @@ -82,16 +82,20 @@ func (f *LogFilter) MarshalJSON() ([]byte, error) {

obj.BlockHash = f.BlockHash

if f.FromBlock == LatestBlockNumber {
obj.FromBlock = ""
} else {
obj.FromBlock = hex.EncodeUint64(uint64(f.FromBlock))
if f.FromBlock != nil && (*f.FromBlock == LatestBlockNumber) {
fromblock := ""
obj.FromBlock = &fromblock
} else if f.FromBlock != nil {
fromblock := hex.EncodeUint64(uint64(*f.FromBlock))
obj.FromBlock = &fromblock
}

if f.ToBlock == LatestBlockNumber {
obj.ToBlock = ""
} else {
obj.ToBlock = hex.EncodeUint64(uint64(f.ToBlock))
if f.ToBlock != nil && (*f.ToBlock == LatestBlockNumber) {
toblock := ""
obj.ToBlock = &toblock
} else if f.ToBlock != nil {
toblock := hex.EncodeUint64(uint64(*f.ToBlock))
obj.ToBlock = &toblock
}

if f.Addresses != nil {
Expand Down Expand Up @@ -127,21 +131,26 @@ func (f *LogFilter) UnmarshalJSON(data []byte) error {
}

f.BlockHash = obj.BlockHash
lbb := LatestBlockNumber

if obj.FromBlock == "" {
f.FromBlock = LatestBlockNumber
} else {
if f.FromBlock, err = stringToBlockNumber(obj.FromBlock); err != nil {
if obj.FromBlock != nil && *obj.FromBlock == "" {
f.FromBlock = &lbb
} else if obj.FromBlock != nil {
bn, err := stringToBlockNumber(*obj.FromBlock)
if err != nil {
return err
}
f.FromBlock = &bn
}

if obj.ToBlock == "" {
f.ToBlock = LatestBlockNumber
} else {
if f.ToBlock, err = stringToBlockNumber(obj.ToBlock); err != nil {
if obj.ToBlock != nil && *obj.ToBlock == "" {
f.ToBlock = &lbb
} else if obj.ToBlock != nil {
bn, err := stringToBlockNumber(*obj.ToBlock)
if err != nil {
return err
}
f.ToBlock = &bn
}

if obj.Address != nil {
Expand Down
4 changes: 4 additions & 0 deletions jsonrpc/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,8 @@ type rpcTransaction struct {
BlockHash *common.Hash `json:"blockHash"`
BlockNumber *argUint64 `json:"blockNumber"`
TxIndex *argUint64 `json:"transactionIndex"`
ChainID argBig `json:"chainId"`
Type argUint64 `json:"type"`
}

func (t rpcTransaction) getHash() common.Hash { return t.Hash }
Expand Down Expand Up @@ -296,6 +298,8 @@ func toRPCTransaction(
S: argBig(*s),
Hash: t.Hash(),
From: from,
ChainID: argBig(*t.ChainId()),
Type: argUint64(t.Type()),
}

if blockNumber != nil {
Expand Down
6 changes: 6 additions & 0 deletions test/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,9 @@ test-e2e-group-1: stop ## Runs group 1 e2e tests checking race conditions
$(RUNSTATEDB)
$(RUNPOOLDB)
$(RUNRPCDB); sleep 5
$(RUNZKPROVER)
docker ps -a
docker logs $(DOCKERCOMPOSEZKPROVER)
trap '$(STOP)' EXIT; MallocNanoZone=0 go test -race -v -p 1 -timeout 600s ../ci/e2e-group1/...

.PHONY: test-e2e-group-2
Expand All @@ -105,6 +108,9 @@ test-e2e-group-3: stop ## Runs group 3 e2e tests checking race conditions
$(RUNSTATEDB)
$(RUNPOOLDB)
$(RUNRPCDB); sleep 5
$(RUNZKPROVER)
docker ps -a
docker logs $(DOCKERCOMPOSEZKPROVER)
trap '$(STOP)' EXIT; MallocNanoZone=0 go test -race -v -p 1 -timeout 600s ../ci/e2e-group3/...

.PHONY: run-db
Expand Down
2 changes: 2 additions & 0 deletions test/e2e/ethtransfer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ func TestEthTransfer(t *testing.T) {
t.Skip()
}

ctx := context.Background()

defer func() { require.NoError(t, operations.Teardown()) }()

err := operations.Teardown()
Expand Down
Loading

0 comments on commit 195207e

Please sign in to comment.