From bb0b68811f4fe5f0b6734cae10e265fd3ab32c01 Mon Sep 17 00:00:00 2001 From: Morgan Kuphal Date: Wed, 27 Mar 2024 17:39:38 -0500 Subject: [PATCH 1/4] Created a GetFilters function for the logpoller --- core/chains/evm/logpoller/disabled.go | 2 ++ core/chains/evm/logpoller/log_poller.go | 30 ++++++++++++++++++++ core/chains/evm/logpoller/log_poller_test.go | 15 ++++++++++ 3 files changed, 47 insertions(+) diff --git a/core/chains/evm/logpoller/disabled.go b/core/chains/evm/logpoller/disabled.go index 0f8faba2695..f3e64378384 100644 --- a/core/chains/evm/logpoller/disabled.go +++ b/core/chains/evm/logpoller/disabled.go @@ -41,6 +41,8 @@ func (disabled) UnregisterFilter(ctx context.Context, name string) error { retur func (disabled) HasFilter(name string) bool { return false } +func (disabled) GetFilters() map[string]Filter { return nil } + func (disabled) LatestBlock(ctx context.Context) (LogPollerBlock, error) { return LogPollerBlock{}, ErrDisabled } diff --git a/core/chains/evm/logpoller/log_poller.go b/core/chains/evm/logpoller/log_poller.go index 490a104aa05..de2a182bbce 100644 --- a/core/chains/evm/logpoller/log_poller.go +++ b/core/chains/evm/logpoller/log_poller.go @@ -41,6 +41,7 @@ type LogPoller interface { RegisterFilter(ctx context.Context, filter Filter) error UnregisterFilter(ctx context.Context, name string) error HasFilter(name string) bool + GetFilters() map[string]Filter LatestBlock(ctx context.Context) (LogPollerBlock, error) GetBlocksRange(ctx context.Context, numbers []uint64) ([]LogPollerBlock, error) @@ -316,6 +317,35 @@ func (lp *logPoller) HasFilter(name string) bool { return ok } +// GetFilters returns a deep copy of the filters map. +func (lp *logPoller) GetFilters() map[string]Filter { + lp.filterMu.RLock() + defer lp.filterMu.RUnlock() + + filters := make(map[string]Filter) + for k, v := range lp.filters { + deepCopyFilter := Filter{ + Name: v.Name, + Addresses: make(evmtypes.AddressArray, len(v.Addresses)), + EventSigs: make(evmtypes.HashArray, len(v.EventSigs)), + Topic2: make(evmtypes.HashArray, len(v.Topic2)), + Topic3: make(evmtypes.HashArray, len(v.Topic3)), + Topic4: make(evmtypes.HashArray, len(v.Topic4)), + Retention: v.Retention, + MaxLogsKept: v.MaxLogsKept, + LogsPerBlock: v.LogsPerBlock, + } + copy(deepCopyFilter.Addresses, v.Addresses) + copy(deepCopyFilter.EventSigs, v.EventSigs) + copy(deepCopyFilter.Topic2, v.Topic2) + copy(deepCopyFilter.Topic3, v.Topic3) + copy(deepCopyFilter.Topic4, v.Topic4) + + filters[k] = deepCopyFilter + } + return filters +} + func (lp *logPoller) Filter(from, to *big.Int, bh *common.Hash) ethereum.FilterQuery { lp.filterMu.Lock() defer lp.filterMu.Unlock() diff --git a/core/chains/evm/logpoller/log_poller_test.go b/core/chains/evm/logpoller/log_poller_test.go index 6605272c672..8e5bc2d75b2 100644 --- a/core/chains/evm/logpoller/log_poller_test.go +++ b/core/chains/evm/logpoller/log_poller_test.go @@ -5,6 +5,7 @@ import ( "fmt" "math" "math/big" + "reflect" "testing" "time" @@ -1283,6 +1284,20 @@ func TestLogPoller_LoadFilters(t *testing.T) { assert.True(t, th.LogPoller.HasFilter("third Filter")) assert.False(t, th.LogPoller.HasFilter("fourth Filter")) }) + + t.Run("GetFilters", func(t *testing.T) { + filters := th.LogPoller.GetFilters() + assert.Equal(t, 3, len(filters)) + assert.True(t, filters["first Filter"].Name == "first Filter") + assert.True(t, reflect.DeepEqual(filters["first Filter"].EventSigs, filter1.EventSigs)) + assert.True(t, reflect.DeepEqual(filters["first Filter"].Addresses, filter1.Addresses)) + assert.True(t, filters["second Filter"].Name == "second Filter") + assert.True(t, reflect.DeepEqual(filters["second Filter"].EventSigs, filter2.EventSigs)) + assert.True(t, reflect.DeepEqual(filters["second Filter"].Addresses, filter2.Addresses)) + assert.True(t, filters["third Filter"].Name == "third Filter") + assert.True(t, reflect.DeepEqual(filters["third Filter"].EventSigs, filter3.EventSigs)) + assert.True(t, reflect.DeepEqual(filters["third Filter"].Addresses, filter3.Addresses)) + }) } func TestLogPoller_GetBlocks_Range(t *testing.T) { From d3f190665542a7c0325da1500ba672666d4498a8 Mon Sep 17 00:00:00 2001 From: Morgan Kuphal Date: Wed, 27 Mar 2024 17:44:12 -0500 Subject: [PATCH 2/4] Changeset --- .changeset/nasty-penguins-smash.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/nasty-penguins-smash.md diff --git a/.changeset/nasty-penguins-smash.md b/.changeset/nasty-penguins-smash.md new file mode 100644 index 00000000000..620e8068e08 --- /dev/null +++ b/.changeset/nasty-penguins-smash.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +Add GetFilters function to the log_poller From 2e6c651d3e5b345a6548d2725489eb85d5e51fc4 Mon Sep 17 00:00:00 2001 From: Morgan Kuphal Date: Wed, 27 Mar 2024 18:51:16 -0500 Subject: [PATCH 3/4] Added mock --- core/chains/evm/logpoller/mocks/log_poller.go | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/core/chains/evm/logpoller/mocks/log_poller.go b/core/chains/evm/logpoller/mocks/log_poller.go index ea129dfc4ef..a8eabaff115 100644 --- a/core/chains/evm/logpoller/mocks/log_poller.go +++ b/core/chains/evm/logpoller/mocks/log_poller.go @@ -67,6 +67,26 @@ func (_m *LogPoller) GetBlocksRange(ctx context.Context, numbers []uint64) ([]lo return r0, r1 } +// GetFilters provides a mock function with given fields: +func (_m *LogPoller) GetFilters() map[string]logpoller.Filter { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for GetFilters") + } + + var r0 map[string]logpoller.Filter + if rf, ok := ret.Get(0).(func() map[string]logpoller.Filter); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(map[string]logpoller.Filter) + } + } + + return r0 +} + // HasFilter provides a mock function with given fields: name func (_m *LogPoller) HasFilter(name string) bool { ret := _m.Called(name) From 43f7c27fd4e7fbed8129cc2a02a8a9d647db61fb Mon Sep 17 00:00:00 2001 From: Morgan Kuphal Date: Thu, 28 Mar 2024 11:31:29 -0500 Subject: [PATCH 4/4] Address feedback to improve test --- core/chains/evm/logpoller/log_poller_test.go | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/core/chains/evm/logpoller/log_poller_test.go b/core/chains/evm/logpoller/log_poller_test.go index 8e5bc2d75b2..2096ccf3cf4 100644 --- a/core/chains/evm/logpoller/log_poller_test.go +++ b/core/chains/evm/logpoller/log_poller_test.go @@ -5,7 +5,6 @@ import ( "fmt" "math" "math/big" - "reflect" "testing" "time" @@ -1288,15 +1287,15 @@ func TestLogPoller_LoadFilters(t *testing.T) { t.Run("GetFilters", func(t *testing.T) { filters := th.LogPoller.GetFilters() assert.Equal(t, 3, len(filters)) - assert.True(t, filters["first Filter"].Name == "first Filter") - assert.True(t, reflect.DeepEqual(filters["first Filter"].EventSigs, filter1.EventSigs)) - assert.True(t, reflect.DeepEqual(filters["first Filter"].Addresses, filter1.Addresses)) - assert.True(t, filters["second Filter"].Name == "second Filter") - assert.True(t, reflect.DeepEqual(filters["second Filter"].EventSigs, filter2.EventSigs)) - assert.True(t, reflect.DeepEqual(filters["second Filter"].Addresses, filter2.Addresses)) - assert.True(t, filters["third Filter"].Name == "third Filter") - assert.True(t, reflect.DeepEqual(filters["third Filter"].EventSigs, filter3.EventSigs)) - assert.True(t, reflect.DeepEqual(filters["third Filter"].Addresses, filter3.Addresses)) + assert.Equal(t, filters["first Filter"].Name, "first Filter") + assert.Equal(t, filters["first Filter"].EventSigs, filter1.EventSigs) + assert.Equal(t, filters["first Filter"].Addresses, filter1.Addresses) + assert.Equal(t, filters["second Filter"].Name, "second Filter") + assert.Equal(t, filters["second Filter"].EventSigs, filter2.EventSigs) + assert.Equal(t, filters["second Filter"].Addresses, filter2.Addresses) + assert.Equal(t, filters["third Filter"].Name, "third Filter") + assert.Equal(t, filters["third Filter"].EventSigs, filter3.EventSigs) + assert.Equal(t, filters["third Filter"].Addresses, filter3.Addresses) }) }