Skip to content

Commit

Permalink
Decouple headtracker tests (#13397)
Browse files Browse the repository at this point in the history
* Add first version of evm utils

* Remove unused context util

* Add WSServer tests

* Add NewLegacyTransaction test

* Update NewTestChainScopedConfig to apply correct defaults

* Decouple config tests

* Decouple headtracker test types from core

* Move testutils

* Update paths

* Update paths

* Add default config validation

* Fix assert import

* Rename test method

* Use common multierror

* Fixes

* Add changeset

* Update dependencies

* Fix tests

* Clean up

* Add changeset

* Fix lint
  • Loading branch information
dimriou authored Jun 5, 2024
1 parent 2fa39b6 commit daf8cf6
Show file tree
Hide file tree
Showing 21 changed files with 525 additions and 543 deletions.
5 changes: 5 additions & 0 deletions .changeset/five-lizards-smile.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"chainlink": minor
---

Remove multiple core dependencies from evm head tracker tests #internal"
20 changes: 0 additions & 20 deletions core/chains/evm/headtracker/config.go

This file was deleted.

60 changes: 29 additions & 31 deletions core/chains/evm/headtracker/head_broadcaster_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,30 +14,29 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/logger"
"github.com/smartcontractkit/chainlink-common/pkg/services/servicetest"
"github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox/mailboxtest"
"github.com/smartcontractkit/chainlink-common/pkg/utils/tests"

commonhtrk "github.com/smartcontractkit/chainlink/v2/common/headtracker"
commonmocks "github.com/smartcontractkit/chainlink/v2/common/types/mocks"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/config/toml"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/mocks"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/types"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/testutils"
evmtypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big"
"github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils/configtest"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils/evmtest"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest"
"github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
)

func waitHeadBroadcasterToStart(t *testing.T, hb types.HeadBroadcaster) {
t.Helper()

subscriber := &cltest.MockHeadTrackable{}
subscriber := &mocks.MockHeadTrackable{}
_, unsubscribe := hb.Subscribe(subscriber)
defer unsubscribe()

hb.BroadcastNewLongestChain(cltest.Head(1))
hb.BroadcastNewLongestChain(testutils.Head(1))
g := gomega.NewWithT(t)
g.Eventually(subscriber.OnNewLongestChainCount).Should(gomega.Equal(int32(1)))
}
Expand All @@ -46,15 +45,14 @@ func TestHeadBroadcaster_Subscribe(t *testing.T) {
t.Parallel()
g := gomega.NewWithT(t)

cfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) {
c.EVM[0].HeadTracker.SamplingInterval = &commonconfig.Duration{}
evmCfg := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) {
c.HeadTracker.SamplingInterval = &commonconfig.Duration{}
})
evmCfg := evmtest.NewChainScopedConfig(t, cfg)
db := pgtest.NewSqlxDB(t)
logger := logger.Test(t)

sub := commonmocks.NewSubscription(t)
ethClient := evmtest.NewEthClientMockWithDefaultChain(t)
ethClient := testutils.NewEthClientMockWithDefaultChain(t)

chchHeaders := make(chan chan<- *evmtypes.Head, 1)
ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything).
Expand All @@ -63,13 +61,13 @@ func TestHeadBroadcaster_Subscribe(t *testing.T) {
}).
Return(sub, nil)
// 2 for initial and 2 for backfill
ethClient.On("HeadByNumber", mock.Anything, mock.Anything).Return(cltest.Head(1), nil).Times(4)
ethClient.On("HeadByNumber", mock.Anything, mock.Anything).Return(testutils.Head(1), nil).Times(4)

sub.On("Unsubscribe").Return()
sub.On("Err").Return(nil)

checker1 := &cltest.MockHeadTrackable{}
checker2 := &cltest.MockHeadTrackable{}
checker1 := &mocks.MockHeadTrackable{}
checker2 := &mocks.MockHeadTrackable{}

orm := headtracker.NewORM(*ethClient.ConfiguredChainID(), db)
hs := headtracker.NewHeadSaver(logger, orm, evmCfg.EVM(), evmCfg.EVM().HeadTracker())
Expand All @@ -85,7 +83,7 @@ func TestHeadBroadcaster_Subscribe(t *testing.T) {
assert.Equal(t, (*evmtypes.Head)(nil), latest1)

headers := <-chchHeaders
h := evmtypes.Head{Number: 1, Hash: utils.NewHash(), ParentHash: utils.NewHash(), EVMChainID: big.New(&cltest.FixtureChainID)}
h := evmtypes.Head{Number: 1, Hash: utils.NewHash(), ParentHash: utils.NewHash(), EVMChainID: big.New(testutils.FixtureChainID)}
headers <- &h
g.Eventually(checker1.OnNewLongestChainCount).Should(gomega.Equal(int32(1)))

Expand All @@ -96,7 +94,7 @@ func TestHeadBroadcaster_Subscribe(t *testing.T) {

unsubscribe1()

headers <- &evmtypes.Head{Number: 2, Hash: utils.NewHash(), ParentHash: h.Hash, EVMChainID: big.New(&cltest.FixtureChainID)}
headers <- &evmtypes.Head{Number: 2, Hash: utils.NewHash(), ParentHash: h.Hash, EVMChainID: big.New(testutils.FixtureChainID)}
g.Eventually(checker2.OnNewLongestChainCount).Should(gomega.Equal(int32(1)))
}

Expand All @@ -107,35 +105,35 @@ func TestHeadBroadcaster_BroadcastNewLongestChain(t *testing.T) {
lggr := logger.Test(t)
broadcaster := headtracker.NewHeadBroadcaster(lggr)

err := broadcaster.Start(testutils.Context(t))
err := broadcaster.Start(tests.Context(t))
require.NoError(t, err)

waitHeadBroadcasterToStart(t, broadcaster)

subscriber1 := &cltest.MockHeadTrackable{}
subscriber2 := &cltest.MockHeadTrackable{}
subscriber1 := &mocks.MockHeadTrackable{}
subscriber2 := &mocks.MockHeadTrackable{}
_, unsubscribe1 := broadcaster.Subscribe(subscriber1)
_, unsubscribe2 := broadcaster.Subscribe(subscriber2)

broadcaster.BroadcastNewLongestChain(cltest.Head(1))
broadcaster.BroadcastNewLongestChain(testutils.Head(1))
g.Eventually(subscriber1.OnNewLongestChainCount).Should(gomega.Equal(int32(1)))

unsubscribe1()

broadcaster.BroadcastNewLongestChain(cltest.Head(2))
broadcaster.BroadcastNewLongestChain(testutils.Head(2))
g.Eventually(subscriber2.OnNewLongestChainCount).Should(gomega.Equal(int32(2)))

unsubscribe2()

subscriber3 := &cltest.MockHeadTrackable{}
subscriber3 := &mocks.MockHeadTrackable{}
_, unsubscribe3 := broadcaster.Subscribe(subscriber3)
broadcaster.BroadcastNewLongestChain(cltest.Head(1))
broadcaster.BroadcastNewLongestChain(testutils.Head(1))
g.Eventually(subscriber3.OnNewLongestChainCount).Should(gomega.Equal(int32(1)))

unsubscribe3()

// no subscribers - shall do nothing
broadcaster.BroadcastNewLongestChain(cltest.Head(0))
broadcaster.BroadcastNewLongestChain(testutils.Head(0))

err = broadcaster.Close()
require.NoError(t, err)
Expand All @@ -149,21 +147,21 @@ func TestHeadBroadcaster_TrackableCallbackTimeout(t *testing.T) {
lggr := logger.Test(t)
broadcaster := headtracker.NewHeadBroadcaster(lggr)

err := broadcaster.Start(testutils.Context(t))
err := broadcaster.Start(tests.Context(t))
require.NoError(t, err)

waitHeadBroadcasterToStart(t, broadcaster)

slowAwaiter := cltest.NewAwaiter()
fastAwaiter := cltest.NewAwaiter()
slowAwaiter := testutils.NewAwaiter()
fastAwaiter := testutils.NewAwaiter()
slow := &sleepySubscriber{awaiter: slowAwaiter, delay: commonhtrk.TrackableCallbackTimeout * 2}
fast := &sleepySubscriber{awaiter: fastAwaiter, delay: commonhtrk.TrackableCallbackTimeout / 2}
_, unsubscribe1 := broadcaster.Subscribe(slow)
_, unsubscribe2 := broadcaster.Subscribe(fast)

broadcaster.BroadcastNewLongestChain(cltest.Head(1))
slowAwaiter.AwaitOrFail(t, testutils.WaitTimeout(t))
fastAwaiter.AwaitOrFail(t, testutils.WaitTimeout(t))
broadcaster.BroadcastNewLongestChain(testutils.Head(1))
slowAwaiter.AwaitOrFail(t, tests.WaitTimeout(t))
fastAwaiter.AwaitOrFail(t, tests.WaitTimeout(t))

require.True(t, slow.contextDone)
require.False(t, fast.contextDone)
Expand All @@ -176,7 +174,7 @@ func TestHeadBroadcaster_TrackableCallbackTimeout(t *testing.T) {
}

type sleepySubscriber struct {
awaiter cltest.Awaiter
awaiter testutils.Awaiter
delay time.Duration
contextDone bool
}
Expand Down
4 changes: 3 additions & 1 deletion core/chains/evm/headtracker/head_listener.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import (

"github.com/smartcontractkit/chainlink-common/pkg/logger"
"github.com/smartcontractkit/chainlink/v2/common/headtracker"

htrktypes "github.com/smartcontractkit/chainlink/v2/common/headtracker/types"
evmclient "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client"
evmtypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
)
Expand All @@ -17,7 +19,7 @@ type headListener = headtracker.HeadListener[*evmtypes.Head, common.Hash]
func NewHeadListener(
lggr logger.Logger,
ethClient evmclient.Client,
config Config, chStop chan struct{},
config htrktypes.Config, chStop chan struct{},
) headListener {
return headtracker.NewHeadListener[
*evmtypes.Head,
Expand Down
Loading

0 comments on commit daf8cf6

Please sign in to comment.