status-go/services/rpcfilters/api_test.go

103 lines
2.5 KiB
Go

package rpcfilters
import (
"context"
"math/big"
"sync"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/eth/filters"
"github.com/ethereum/go-ethereum/rpc"
)
func TestFilterLiveness(t *testing.T) {
api := &PublicAPI{
filters: make(map[rpc.ID]filter),
filterLivenessLoop: 10 * time.Millisecond,
filterLivenessPeriod: 15 * time.Millisecond,
client: func() ContextCaller { return &callTracker{} },
}
id, err := api.NewFilter(filters.FilterCriteria{})
require.NoError(t, err)
quit := make(chan struct{})
var wg sync.WaitGroup
wg.Add(1)
go func() {
api.timeoutLoop(quit)
wg.Done()
}()
tick := time.Tick(10 * time.Millisecond)
after := time.After(100 * time.Millisecond)
func() {
for {
select {
case <-after:
assert.FailNow(t, "filter wasn't removed")
close(quit)
return
case <-tick:
api.filtersMu.Lock()
_, exist := api.filters[id]
api.filtersMu.Unlock()
if !exist {
close(quit)
return
}
}
}
}()
wg.Wait()
}
func TestGetFilterChangesResetsTimer(t *testing.T) {
api := &PublicAPI{
filters: make(map[rpc.ID]filter),
filterLivenessLoop: 10 * time.Millisecond,
filterLivenessPeriod: 15 * time.Millisecond,
client: func() ContextCaller { return &callTracker{} },
}
id, err := api.NewFilter(filters.FilterCriteria{})
require.NoError(t, err)
api.filtersMu.Lock()
f := api.filters[id]
require.True(t, f.deadline().Stop())
fake := make(chan time.Time, 1)
fake <- time.Time{}
f.deadline().C = fake
api.filtersMu.Unlock()
require.False(t, f.deadline().Stop())
// GetFilterChanges will Reset deadline
_, err = api.GetFilterChanges(id)
require.NoError(t, err)
require.True(t, f.deadline().Stop())
}
func TestGetFilterLogs(t *testing.T) {
t.Skip("Skipping due to flakiness: https://github.com/status-im/status-go/issues/1281")
tracker := new(callTracker)
api := &PublicAPI{
filters: make(map[rpc.ID]filter),
client: func() ContextCaller { return tracker },
}
block := big.NewInt(10)
id, err := api.NewFilter(filters.FilterCriteria{
FromBlock: block,
})
require.NoError(t, err)
logs, err := api.GetFilterLogs(context.TODO(), id)
require.NoError(t, err)
require.Empty(t, logs)
require.Len(t, tracker.criteria, 1)
rst, err := hexutil.DecodeBig(tracker.criteria[0]["fromBlock"].(string))
require.NoError(t, err)
require.Equal(t, block, rst)
}